154

myrepoリモートbeanstalkサーバーで呼び出されたリポジトリがあります。

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

ありがとう!

4

9 に答える 9

138

オプションを指定してgitmergeコマンドを使用することでこの問題を解決し--no-commit、ステージングされたファイルを明示的に削除して、ファイルへの変更を無視しました。例:変更を無視したい場合は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ループに入れることができます。

于 2013-05-09T06:34:50.743 に答える
59

結局gitを見つけましたattributes。それを試してみてください。これまでのところ働いています。まだすべてのシナリオをチェックしていません。しかし、それが解決策になるはずです。

マージ戦略-Git属性

于 2013-03-05T20:29:38.933 に答える
27

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

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

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

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

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

     <pattern> merge=foo
    

    例を見てみましょうconfig.xml

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

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

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

詳細については、merge_strategiesをご覧ください。

于 2018-03-19T08:27:06.730 に答える
10

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

于 2013-03-05T19:07:24.447 に答える
9

例:

  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
于 2018-12-10T08:33:45.743 に答える
5

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

于 2013-03-05T19:24:49.537 に答える
5

多くの人がコメントしているように、受け入れられた回答とそのコピー(特定のファイルに対してカスタムマージ戦略を使用)は、実際にマージの競合が発生する場合にのみ機能することに注意してください。

マージの競合が発生せず、したがってコミットがマージされる2つの単純なケース:

  • config.xmlマスターではなく、機能ブランチにファイルがあります。マージ中に除外したい
  • config.xml両方のブランチのファイルは、同じコミットに基づいています。機能内のファイルに新しいコードが追加されます。

unmesh-gurjarmerge --no-commitで示されているように使用するか、マスターへの個々のコミットを単純に選択します。後者はもちろんかなり面倒で、他にもいくつかの落とし穴があります(新しいSHA1 IDなど)

于 2021-03-03T18:50:55.800 に答える
3

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

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

例:-

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

于 2015-09-28T17:00:10.880 に答える
0

gitフックの使用を検討してください:

git checkoutを正常に実行すると、チェックアウト後のフックが実行されます。これを使用して、プロジェクト環境に合わせて作業ディレクトリを適切に設定できます。これは、ソース制御、自動生成ドキュメント、またはそれらの線に沿った何かを望まない大きなバイナリファイルに移動することを意味する場合があります。

ソース:https ://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks#:〜:text = After%20you%20run、along%20those%20lines 。

これらのファイルを別のディレクトリに配置し、必要に応じて、を介してリポジトリから除外するように選択できます.gitignore

切り替えられるブランチの名前に基づいて、post-checkoutフックからのスクリプトは、そのブランチの正しいファイル(サブディレクトリにある可能性があります)を取得し、それらを正しい場所にコピー(上書き)できます。ブランチ固有のこれらの個々のファイルは、にある必要があります.gitignore

post-checkoutのスクリプトの例.git/hooks

#!/bin/sh

BRANCH=`git reflog | awk 'NR==1{ print $8; exit }'`

cp "./configs/$BRANCH/config.json" "./config.json"

exit 0

于 2022-01-20T10:50:47.970 に答える