184

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

私の動機は、このファイルにマシン固有の情報が含まれていることです。デフォルト値を提供すると同時に、元のリポジトリにプッシュバックされないローカル変更をユーザーが行えるようにし、新しい変更をプルするときにマージの競合を作成したいと思います。

私たちは一般的にかなり怠惰でgit add .多くを使用しているので、このファイルを無視するようにgitに指示できない場合、ファイルへの変更はコミットされてプッシュされることになります。

要約する、

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

7 に答える 7

185

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

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アップストリームの変更がプルされるとステータスが失われることに注意してください。

于 2016-09-29T17:03:05.323 に答える
51

あなたが探しているのはですgit update-index --assume-unchanged default_values.txt

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

于 2010-12-03T19:08:16.447 に答える
23

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

于 2010-12-03T18:28:29.870 に答える
6

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

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

スマッジ/クリーンスクリプトは、それらを複数回適用するという点で決定論的である必要があります。異なる順序で、シーケンスの最後のスクリプトを実行するのと同じです。

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

于 2010-12-03T18:53:14.790 に答える
3

インデックス内のファイルの内容を単純にキャットする「クリーン」フィルターを定義することで、これを解決しました。

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

残念ながら、クリーンなスクリプト内からどのファイルを処理しているかを判断する方法がないため、これを複数のファイルに一般化できるようにする方法を見つけることができません。もちろん、ファイルごとに異なるフィルタールールを追加することを妨げるものは何もありませんが、少し扱いに​​くいです。

于 2013-05-20T14:34:59.647 に答える
1

私は自分のチームに役立つ解決策を見つけました。シンボリックリンクを介してgithookを共有し、テンプレートファイルをgitに追加した後、テンプレートファイルが変更されているかどうかを確認するpre-commitフックを追加しましたgit reset -- templatefile.txt。それが唯一の変更されたファイルである場合、私もコミットを中止します。

于 2018-04-24T12:35:04.607 に答える
-2

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

于 2010-12-03T18:46:39.260 に答える