web-dev-qa-db-ja.com

gitにファイルの将来のリビジョンを無視させるにはどうすればよいですか?

Gitリポジトリに含まれるファイルのデフォルトバージョンを作成しました。誰かがリポジトリのクローンを作成するときに、このファイルのコピーを取得することが重要です。ただし、後でこのファイルへの変更を無視するようにgitを設定したいと思います。 .gitignoreは、追跡されていないファイルでのみ機能します。

私の動機は、このファイルにマシン固有の情報が含まれていることです。デフォルト値を提供したいのですが、Originリポジトリにプッシュバックされないローカルな変更をユーザーに許可し、新しい変更をプルするとマージの競合が発生します。

私たちは通常かなり怠け者であり、git add .たくさんあるので、このファイルを無視するようにgitに指示できないなら、変更をコミットしてプッシュすることになります。

要約する、

  1. ファイルを作成したいので、default_values.txtこれは私のgitリポジトリに追加され、誰かがそのリポジトリを複製するときに含まれます。
  2. git add .は追加しないでくださいdefault_values.txtコミットします。
  3. この動作は、リポジトリのクローンに渡される必要があります。
99
Marc

他の多くの人が言及したように、優れた最新のソリューションは次のとおりです。

git update-index --skip-worktree default_values.txt

ローカルおよびアップストリームの両方でそのファイルへの変更を無視します:

git update-index --no-skip-worktree default_values.txt

スキップされたとマークされたファイルのリストを取得できます:

git ls-files -v . | grep ^S

--skip-worktreeとは異なり、アップストリームの変更がプルされると、-assume-unchangedステータスが失われることに注意してください。

67
moodboom

探しているのはgit update-index --assume-unchanged default_values.txt

詳細については、ドキュメントを参照してください: http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html

47
tamasd

私が一般的に見たアプローチは、別の名前でファイルを作成することです:例えば:default_values_template.txtと.gitignoreにdefault_values.txtを入れます。 default_values_template.txtをローカルワークスペースのdefault_values.txtにコピーし、必要に応じて変更するように人々に指示します。

19

スマッジ/クリーンスクリプトを見てください。この方法でファイルをバージョン管理できますが、チェックアウトされると、汎用/プレースホルダーデータをファイル内のマシン固有のデータで置き換えることにより、ファイルを「汚す」ことになります。

コミットするときは、マシン固有の情報を汎用情報またはプレースホルダー情報に置き換えることで「クリーン」にします。

スマッジ/クリーンスクリプトは、異なる順序で複数回適用すると、シーケンスの最後のスクリプトを実行するのと同等になるという点で、確定的でなければなりません。

リポジトリを公開する必要がある場合もパスワードに同じことが適用できますが、コンテンツには機密情報が含まれる場合があります。

5
Adam Dymitruk

これを解決するには、「クリーン」フィルターを定義して、インデックス内のファイルの内容を単純にcatします。

git show :path/to/myfileは、指定されたファイルのインデックスの内容を出力するだけなので、スクリプトでそれを使用して、インデックス内の作業コピーを未処理のコピーに置き換えることができます。

#! /bin/sh

git show :$1

関係するファイルの「クリーン」フィルタとして設定します(「discard_changes」に配置したと仮定):

$ git config filter.ignore_myfile.clean "discard_changes path/to/myfile"
$ echo "path/to/myfile filter=ignore_myfile" >> .gitattributes

残念ながら、これを複数のファイルに一般化する方法を見つけることができません。クリーンスクリプト内からどのファイルを処理しているかを知る方法がないからです。もちろん、各ファイルに異なるフィルタールールを追加することを止めるものは何もありませんが、少し不器用です。

3
Haddon CD.

私のチームに合ったソリューションを見つけました。シンボリックリンクを介してgithookを共有し、gitにテンプレートファイルを追加した後、テンプレートファイルが変更されているかどうかを確認する事前コミットフックを追加しました。変更されている場合は_git reset -- templatefile.txt_。変更された唯一のファイルである場合、コミットも中止します。

1
fruitcoder

サブモジュールを調べることをお勧めします。マシン固有のファイルをサブモジュールに配置する場合、git addはそれを無視する必要があります。

0
ivanpro