3

2 つのブランチで異なる構成ファイルがあります。この構成ファイルは各ブランチ内で追跡されますが、ブランチをマージするときは常に無視されます。

そのため、2 つのブランチをマージした後、ファイルはマージ前と同じように各ブランチに残ります。

4

2 に答える 2

1

以下のフックを使用するには、次のようにします。

echo path/to/protected/file config >> .git/info/attributes
git config --add branch.server1.protect-attr config

属性configprotect-attr分岐アイテムはそのための発明です。

  • .git/hooks/post-merge:

    #!/bin/sh
    protect="$(git config --get-all branch."$(git branch|sed -n 's/^\*.//p')".protect-attr)"
    if test ! -z "$protect"; then
        git diff --name-only HEAD@{1} HEAD \
        | git check-attr --stdin $protect \
        | sed -n '/: unspecified$/!s,:.*,,p' \
        | sort -u \
        | sed -e 's,^,git checkout HEAD@{1} -- ",' -e 's,$," # protected file changed by merge,'
    fi
    

fooそして、ブランチ構成へのマージは、構成としてタグ付けしたファイルまたはその他のファイルへの変更が、それらを保護するようにマークされたブランチにマージされると、元に戻すコマンドをポップします..

$ git merge wip
Updating 9906beb..888556e
Fast-forward
 foo | 1 +
 1 file changed, 1 insertion(+)
git checkout HEAD@{1} -- "foo" # protected file changed by merge

|sh -xパイプ ステージを追加して、元に戻すだけにすることもできますgit commit --amend --no-edit。フルオートにすることもできます。これはほとんどスターター キットです。詳細については、githooksgitattributes、およびgit configのマンページを参照してください。

より埋め込みやすい方法で git を再実装するlibgit2プロジェクトがあります。それは git ではありませんが、すべての git を必要としない場合に利点があります。残念ながら、これを処理するにはまだ完全ではありません。そのため、制限されたクライアントではなく、完全な gitを使用していることを確認してください。

于 2013-04-05T19:42:51.737 に答える
1

oursまず、まだマージ ドライバがない場合は、マージ ドライバを作成する必要があります。これを行うには、次のコマンドを実行します。

 git config merge.ours.driver true

このドライバーを使用すると、マージ セッション中に宛先ブランチのバージョンのファイルを優先できます。

次に、ブランチAB.

branchのファイルのディレクトリに、次の行をA含むという名前のファイルを作成します。.gitattributes

myconfig.conf merge=ours

次に、ファイルを追加してコミットし.gitattributesます。

にマージするとき、git は常にAのバージョンを保持します。にもマージする必要がある場合は、ブランチに対して同じ手順を繰り返します。myconfig.confBAABB

于 2013-04-05T10:57:23.117 に答える