4

私が取り組んでいるプロジェクトでは、開発を支援するツールを開発することにしました。
git はとても素晴らしいので、おそらくいくつかのファイルを防止する機能があれば(はい、ファイルのみ: これは Magento プロジェクトであり、開発するツールは彼自身のモジュールにあり、アプリケーションの残りの部分) は master にマージされますが、他のブランチで利用できるはずです。
役に立ったら、git-flow を使用することを考えています。したがって、master を作成し、そこからdevelop を作成し、そこからすべてのフィーチャー ブランチを作成します。アイデアは、このモジュールを開発することですが、マスターにマージすることはありません。

私は今、master ブランチでのみこれらのファイル (.gitignore) を無視するようなことを考えていますが、それはうまくいくでしょうか?

編集 1: プロジェクト
の構造 プロジェクトの構造についてさらに情報を提供する必要があると感じています。

+ main_folder/
    + magento/
    |---+ app/
    |   |--+ code/
    |   |  |--+ community/
    |   |  |--+ core/
    |   |  |--+ local/
    |   |     |--+ Namespace1/
    |   |        |--+ Module1/
    |   |        |--+ Module2/
    |   |     |--+ Namespace2/
    |   |        |--+ Module1/
    |   |        |--+ Module2/
    |   |--+ design/
    |   |  |--+ frontend/
    |   |     |--+ default/
    |   |        |--+ default/
    |   |           |--+ layout/
    |   |           |--+ template/
    |   +  js/
    |   +  lib/
    +  ezpublish/

開発ツール モジュールは、メイン プロジェクト (magento 部分のみ) のさまざまな場所に含める必要があります。つまり、app/code/local/Namespace1/ Module3 /、app/design/frontend/layout/ dev.xml、app/design です。/frontend/template/dev/tool.phtmlおよび js/ dev /

編集2:
@VonCの答えを探るサブモジュールオプション、これが私がやったことです:

  • ブランチ マスターで:
    • git サブモジュールを追加 git@github.com:path/to/submodule.git devtool
    • CD開発ツール
    • git checkout 123abc #サブモジュールの初期コミット
    • CD ..
    • git add 開発ツール
    • git commit -m "最初のコミットでサブモジュールを追加"
  • ブランチ開発中:
    • CD開発ツール
    • git checkout abc213 #サブモジュールの最後のコミット
    • CD ..
    • git add 開発ツール
    • git commit -m "最後のコミットのサブモジュール"
  • ブランチ マスターに戻ります。
    • touch .gitattributes
    • .gitattributes にこれを入れました:devtool merge=ours
    • git add .gitattributes
    • git commit -m ".gitattributes ディレクティブ"

しかし、マスターのサブモジュールには最後のコミットの内容があり、マスターの最初のコミットをチェックアウトし、開発にチェックアウトしても、最初のコミットはまだそこにあります(開発に最後のコミットが必要な場合)。
だから私は明らかに何か間違ったことをしていますが、何ですか?

4

3 に答える 3

11

サブモジュールを使用して、一連のファイルを独自のレポに分離することを強くお勧めします。

アイデアは次のとおりです。サブモジュールを使用している場合、親ディレクトリで行う必要があるのは、1 つの要素(および 1 つだけ)のマージを防止することだけです。そのサブモジュールの SHA1 を記録する特別なエントリです。
サブモジュール ファイルのマージについて心配する必要はありません。

あなたはできる:

于 2013-09-17T06:54:50.523 に答える
2

最善の解決策は、git フックを使用することです。

これが実際の例です "私はそれをテストし、正常に動作することを確認しました"

使用法 :

git add . // たとえば、すべてのファイルを追加します (除外したいファイルを含む)
git commit -am 'Test pre-commit' // すべてのファイルをコミットします "pre-commit" フックが実行されます


ディレクトリ構造の例

|-- ex.file
|-- module
|   |-- f2.php
|   |-- f3.php
|   `-- file.php
`-- xml
    |-- file.xml
    `-- file1.xml

git ルート ディレクトリにファイルを作成し、除外したいファイルまたはフォルダーを含む { .ignorefolders } という名前を付けます "下の例"

/module/
/xml/file.xml
/ex.file

ルートディレクトリに関連させたいので、各行の先頭に「/」を追加しました「
完全なフォルダー、個々のファイルを追加できます」


以下の内容でファイル { pre-commit } をフォルダー { .git/hooks } に作成します

ROOTDIR=$(git rev-parse --show-toplevel) #root folder
FILENAME="$ROOTDIR/.ignorefolders" #configuration file

if [ ! -f $FILENAME ]; then
    echo "File '.ignorefolders' not found!"
    exit 1
fi

BRANCHES=("master") # branches array to untrack this folders and files from if you want to remove this files from more than branch for example BRANCHES=("master" "branch2" "branch3")
CURRENTBRANCH=$(git branch | sed -n -e 's/^\* \(.*\)/\1/p') #get current branch name

if [[ ! "$(declare -p BRANCHES)" =~ '['([0-9]+)']="'$CURRENTBRANCH'"' ]];then  #check if the current branch is NOT in the array of the branches
    exit 0
else
  echo "Executing pre-commit hook in $CURRENTBRANCH Branch"
fi

function removeFromGitAdd {
   PARAM="$ROOTDIR$1"
   if [ -e $PARAM ]; then
        #file or folder exist
        if [[ -n $(git ls-files $PARAM ) ]]; then
            #echo "there are files with this path added in the current commit"
            git rm --cached $PARAM -r #removing this files/folders
        else
            #echo "There is no file"
            echo ''
        fi
        
   fi
}
cat $FILENAME | while read LINE
do
       #echo $LINE
       removeFromGitAdd $LINE
done

ノート :

コードは十分に文書化されています (exit または return を使用できます) 条件ステートメントで必要なロジックに依存します!

return ==> コミットは続行し
ます exit ===> コミットは中止されます

使用事例 :

「git-add .」を追加すると、追加したすべてのファイルは、構成ファイル「.ignorefolders」で除外されます。次に、コミットしようとします!
ファイルはコミットから削除されますが、空の「変更なし」のコミットをコミットできます。

于 2013-09-20T19:39:24.473 に答える