web-dev-qa-db-ja.com

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

リモートmyrepoサーバーにbeanstalkというリポジトリがあります。

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

今:

 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は機能しないと思います。他のオプションは何ですか?無視されたファイルはチェックアウトとコミットの一部である必要があることに注意してください。これは重要です。マージ中のみ無視する必要があります。

ありがとう!

91
Kevin Rave

Git attributesを見つけました。やってみて。これまでのところ。まだすべてのシナリオをチェックしませんでした。しかし、それは解決策でなければなりません。

戦略の統合-Git属性

43
Kevin Rave

--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ループに入れることができます。

75
unmesh-gurjar

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

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

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

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

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

    config.xml merge=ours
    
  3. そして、次のようにダミーのマージ戦略を定義します。

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

stag form devブランチをマージする場合、マージがconfig.xmlファイルと競合する代わりに、stagブランチのconfig.xmlは元のバージョンを保持します。

13
eigenharsha

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

5
gcbenison

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

3
tlehman

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

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

例:-

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

1

例:

  1. 次の2つのブランチがあります:master、_develop
  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
0
Sole Sensei