Git-マージ中にファイルを無視する


114

myrepoリモートbeanstalkサーバーでrepoが呼び出されました。

私はそれを私のローカルマシンにクローンしました。二つの追加のブランチを作成:stagingdev。これらのブランチをリモートにもプッシュしました。

今:

 local                   remote                   server
 --------------------------------------------------------  
 master  ==> Pushes to  `master`  ==> deployed to `prod`
 staging ==> Pushes to  `staging` ==> deployed to `staging`
 dev     ==> Pushes to  `dev`     ==> deployed to `dev`

config.xmlブランチごとに異なるというファイルがあります。

マージ中のみこのファイルを無視したい。しかし、私はチェックアウトまたはリポジトリブランチから/にコミットするときにこれを含めたいです。

これが必要な理由は、特定のブランチをプル(チェックアウト)してそれぞれのサーバーにデプロイするデプロイスクリプトがあるためです。そのためconfig.xml、展開時に、上記のように特定のブランチのファイルを特定のサーバーに入れる必要があります。

私は.gitignore働かないと思います。他のオプションは何ですか?無視されたファイルはチェックアウトとコミットの一部である必要があることに注意してください。これは重要です。マージ中のみ無視してください。

ありがとう!


デフォルトモードでは、git pullはgit fetchの後にgit merge FETCH_HEADが続く形式です。だからあなたはお互いに一種の矛盾を述べています。
zzk 2013年

まあ、私は、そのチェックアウトだと思います。引っ張らない。質問が明確になるように更新します。
Kevin Rave 2013年


2
これに対する解決策を見つけたことがありますか?git属性は、ファイルがマージされるブランチ間で競合する場合にのみ役立つため、常に十分であるとは限りません。
pvinis

シンボリック(gitが後に続かない)またはレスキューへのハードリンクを調べましたか?
フランク・ノッケ2017年

回答:


94

--no-commitオプションでgit mergeコマンドを使用してこの問題を解決し、ステージングされたファイルを明示的に削除して、ファイルへの変更を無視しました。例:変更を無視したい場合myfile.txt、次のように進めます。

git merge --no-ff --no-commit <merge-branch>
git reset HEAD myfile.txt
git checkout -- myfile.txt
git commit -m "merged <merge-branch>"

スキップするファイルのリストがある場合は、ステートメント2と3をforループに入れることができます。


2
早送り戦略でマージが発生したときにファイルが上書きされないようにするには、「-no-ff」を追加します。
Ilia Shakitko 2017

1
だからgit reset HEAD myfile.txt正確には何をしますか?ここで私たちの目標にどのように役立ちますか?
Kid_Learning_C

2行目と3行目をループにするにはどうすればよいですか?
AndroidDev

52

gitを見つけましたattributes。やってみる。これまでのところ。まだすべてのシナリオを確認していません。しかし、それは解決策であるべきです。

マージ戦略-Git属性


4
しかし、私はこれを見つけましたgit-scm.com/book/ch7-2.html#Merge-Strategies
Nate-

1
ここでのgitのマージ戦略セクションのための正しいリンクは、ドキュメントの属性です:git-scm.com/book/en/v2/...
エイドリアンLaurenzi

3
これは、medium.com
@

9
競合がない場合、これは問題と思われますか?ファイルはまだマージされますか?
ブレット

18

.gitattributes -サブディレクトリまたはファイルのサブセットの属性を定義するリポジトリのルートレベルのファイルです。

この属性を指定して、特定のファイルに対して異なるマージ戦略を使用するようGitに指示できます。ここではconfig.xml、ブランチの既存のものを保持します。私たちは、設定する必要がありますmerge=oursconfig.xmlして.gitattributesファイル。

merge=ours マージ競合が発生した場合、gitに(現在のブランチ)ファイルを使用するように指示します。

  1. .gitattributesリポジトリのルートレベルでファイルを追加する

  2. .gitattributesファイルでconfix.xmlの属性を設定できます

    config.xml merge=ours
    
  3. そして、ダミーの私たちのマージ戦略を定義します:

    $ git config --global merge.ours.driver true
    

stagフォームdevブランチをマージすると、マージがconfig.xmlファイルと競合するのではなく、stagブランチのconfig.xmlが元々あったバージョンで保持されます。


15
しかし、対立がない場合はどうなりますか?マージ中に常に特定のファイルを保持する方法は?
Igor Yalovoy

2
@IgorYalovoy:競合がない場合...まあ、これは実際にはハッシュIDから機能するので少しトリッキーですconfig.xmlが、マージベースからブランチチップバージョンに完全に変更されていない場合、Gitは変更されたバージョンをそのまま使用しますmerge.ours.driver設定を見て。だからあなたは心配するのは正しいです。
torek

1
Gitドキュメントからコピーして貼り付け:戦略のマージ-Git属性。リンク
kyb 2018

この方法では、FYIのたびに「コミットのマージ」が行われます。
rsmets

2
「ours」は、導入されている新しい戦略の任意の名前のようです。theirs組み込みのマージ戦略であるため、これは混乱を招きました。しかし、1つが書くことができると思われ<pattern> merge=foo、その後、git config --global merge.foo.driver true、それは同じように動作します。
カイルストランド

8

最初にを使用してgit merge --no-commitから、必要に応じてマージを編集することができます。つまり、ステージング解除config.xmlやその他のファイルを実行してからコミットします。その後、フックを使用してさらに自動化する必要があると思いますが、少なくとも1回は手動で実行する価値があると思います。


2
ないgit attributes任意のストレートソリューションを提供しますか?これは理解できません。 git-scm.com/book/en/...
ケビン・レイヴ

4

を使用.gitignoreconfig.xmlてリポジトリに入れずに、コミット後フックを使用して適切なconfig.xmlファイルをサーバーにアップロードできます。


1
私はそれが一種のハックであることを知っています。私はきれいな解決策を見つけようとしています。gitのはどうattributes。それがどのように機能するか考えていますか?これは理解できません。 git-scm.com/book/en/...
ケビン・レイヴ

1
私はこれらについて聞いたことがありません、私はmerge = ours属性を適用しようとしています、有望に見えます。
tlehman 2013年

1
Gitの属性は素晴らしいです!非テキストファイルを比較する方法をgitに伝えることもできるので、pdf2textを使用してPDFを比較できます。
tlehman 2013年

2

例:

  1. 2つのブランチがあります:masterdevelop
  2. developブランチにファイルを作成し、マージ中にそれを無視したい

コード:

git config --global merge.ours.driver true
git checkout master
echo "path/file_to_ignore merge=ours" >> .gitattributes
git merge develop

同じ拡張子のファイルを無視することもできます

たとえば、.txt拡張子が付いたすべてのファイル:

echo "*.txt merge=ours" >> .gitattributes

1

ここでgit-update-index-作業ツリーのファイルの内容をインデックスに登録します。

git update-index --assume-unchanged <PATH_OF_THE_FILE>

例:-

git update-index --assume-unchanged somelocation/pom.xml


これは、プッシュするときは便利ですが、プルするときにファイルが上書きされる可能性がある場合でも問題があります。
Rolf

1
.gitignoreファイルにファイルエントリを追加しようとしましたか?@ロルフ
シリーシュヤラガダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.