web-dev-qa-db-ja.com

GIT-コミットからファイルを除外/無視

Gitのファイルを無視する必要があります!実際、無視することは正しい言葉だとは思いません。ファイルをgitに入れたいのですが、変更をコミットしたくありません。これは一部の人にとっては奇妙なことのように思えるかもしれませんが、この機能を必要とするインスタンスはたくさんあります。私が今必要としているのは、CMSでgitを使用するときです。 CMSは常に変更されているファイルがないと機能しませんが、最初のコミット後にこれらのファイルがコミットされることは望ましくありません。 (これはSVNとTortoiseで非常に簡単です)。

ワークフロー:

  1. アプリの実行に必要なすべてのファイルを取得します。
  2. コミット時に指定されたディレクトリ/ファイルを無視します。

ここに私が試したものがあります:

  1. .gitignore-ファイルがgitに入ることはありません。ファイルが既にキャッシュにある場合、.gitignoreファイルは何もしません。
  2. /.git/info/exclude-.gitignoreと同じ問題ですが、ローカルリポジトリのみが対象です。
  3. 分岐-master => LocalIgnores => WorkingBranch。 Workingブランチがmasterとマージされると、LocalIgnoresから行われた変更は最終的にmasterになります。また、新しいブランチの1つをチェックアウトすると、削除されたファイルは無視される代わりに削除されます。
  4. サードパーティのファイル構造-.gitignoreファイルを使用する作業ディレクトリにコピーできるように、すべての重要なサードパーティファイルのコピーを保持するルートノード上のサードパーティディレクトリ。 (これは機能しますが、より簡単な/より良い解決策が必要です)。
38
Patrick

類似の質問 からの私の答えはここにあります。

git update-index はあなたが望むことをするべきです

これは、ファイルへの変更を無視して開始することをgitに指示します
git update-index --assume-unchanged path/to/file

再び追跡を開始する場合
git update-index --no-assume-unchanged path/to/file

92
Andy

別の解決策は、pre-commitフックを使用することです。詳細については、git help hooksを参照してください。

  • これは設定が難しくなります。シェルスクリプトを作成して、許可または拒否する内容を正確に表現する必要があります。これは、おそらくgitを十分に把握する必要があることを意味します。

  • より永続的で柔軟性があります。git update-indexなどのトリックを使用すると、誤って実行するのを忘れたりする可能性があります。しかし、いったんフックを設定すると、もう一度心配する必要はありません。

提案されている他のトリックと同様に、フックはリポジトリ間で自動的に伝播されませんが、canそれらを通常のファイルとしてチェックインし、全員を.git/hooksにリンクさせます。

2
wjl