Gitリポジトリにファイルを保持しますが、変更は追跡しません


305

私はCodeIgniterサイトにいくつかのファイルを持っていますが、それらをリポジトリに入れたいのですが、変更を追跡しません。

たとえば、このフレームワークの新しいインストールを新しいクライアントに展開し、次のファイルをダウンロードして(デフォルト値はCHANGEME)、このクライアントに固有の変更(データベースの資格情報、電子メールアドレス情報、カスタムCSS)。

// the production config files i want the files but they need to be updated to specific client needs
application/config/production/config.php
application/config/production/database.php
application/config/production/tank_auth.php
// index page, defines the environment (production|development)
/index.php
// all of the css/js cache (keep the folder but not the contents)
/assets/cache/*
// production user based styling (color, fonts etc) needs to be updated specific to client needs
/assets/frontend/css/user/frontend-user.css

現在私が走れば

git clone git@github.com:user123/myRepo.git httpdocs

上記のファイルを編集すると、すべてが素晴らしいです。修正プログラムまたはパッチをリリースして実行するまでgit pull。その後、すべての変更が上書きされます。





クライアントの資格情報/構成ファイルを無視して、リポジトリがインストールされているときに欠落している場合、プログラムにデフォルトのファイルを作成させることができますか?
MatthewG

回答:


618

gitにはこれを行う別のソリューションがあります。最初に、追跡したくないファイルを変更し、次のコマンドを使用します。

git update-index --assume-unchanged FILE_NAME

変更を再度追跡する場合は、次のコマンドを使用します。

git update-index --no-assume-unchanged FILE_NAME

git-update-indexのドキュメント


私はあなたの言うことをしましたが、git statusはファイルが変更されたことを伝え続けます
rraallvv

7
ええ、これは「受け入れられた答え」であるべきです。私のために働いた。
joshmcode

34
浜野純生(Gitのメンテナー)によると:「仮定の変更は無視メカニズムのために乱用されるべきではありません。追加のlstat(2)コストを発生させることなく、変更されていないとマークされたパスが変更されたと判断できる場合、パスが変更されたことを報告する権利を留保します(結果として、「git commit -a」は自由にコミットできます変化する)。" 言い換えると、仮定が変更されていないのは、ローカルのパフォーマンスの問題のためだけです。Gitがこれらのファイルがより簡単に変更されたと判断できる場合は、変更されます。
アレハンドロガルシアイグレシアス

41
その情報を読んで、私は--skip-worktreeオプションがこの仕事に適していると思います--assume-unchanged
PJSCopeland 2016年

26
--skip-worktreeは確かに優れたオプションです。詳細:stackoverflow.com/questions/13630849/…–
カスタマイザ

80

別の回答のコメントから回答を引き出すには:

$ git update-index --skip-worktree FILENAME

より良いオプションのようです --assume-unchanged

:もっとここにこのについて読むことができます- 「と仮定し、変わらない」の違いと「スキップworktree」Gitリポジトリ


3
ありがとう。また、medium.com
@ igloude

これを実行してからブランチを変更しようとすると、「次の追跡されていない作業ツリーファイルがチェックアウトによって上書きされます...ブランチを切り替える前に移動または削除してください」というメッセージが表示されます。回避するためのアイデアはありますか?
Patrick Szalapski、

@aexlで参照される記事はに移動しましたcompiledsuccessfully.dev/git-skip-worktree
アンドリュー・キートン

1
ドキュメントは、これは悪い考えであると言います。「ユーザーは、仮定された変更されていないおよびワークツリーのスキップビットを使用して、追跡されているファイルへの変更を無視するようにGitに指示しようとすることがよくあります。Gitは特定の操作を実行するときにインデックスに対して作業ツリーファイルを引き続きチェックする可能性があるため、期待どおりに機能しません。一般に、Gitは追跡されたファイルへの変更を無視する方法を提供しないため、代替ソリューションが推奨されます。」
Curtis Blackwell

58

私のCode Igniterプロジェクトでは、database.php.exampleconfig.php.exampleをリポジトリに保持しています

次に、config.phpapplications / config / database.php.gitignoreファイルに追加します。

したがって、最後に、デプロイするときに.exampleファイルを(config.phpおよびdatabase.phpに)コピーしてカスタマイズできます。これらのファイルはGITによって追跡されません。


12
素晴らしい解決策ですが、ナシルハンの答えが一番良いと思います。
ワードフォーザワイズ

これは良い解決策ではありません。gitインデックスをフラッシュすると、意図しないときに変更の追跡が開始されます。これを行う正しい方法については、@ nasirkhansの回答を参照してください。
Brian Melton-Grace-MSFT 2015年

3
以前の両方のコメントに同意しません。このようにすると、「デフォルト」値をチェックアウトすることなく更新し、ローカル構成を別の場所にコピーして後で戻すだけで済みます。また、すべてのリポジトリに適用されるため、リポジトリの変更を繰り返す必要はありません。
OskarD90 2016年

1
それがgitignoreにある場合、なぜ変更の追跡を再開するのか
Shapeshifter

OPの問題を解決しますが、実際には質問には答えません。
Travis Wilson

1

それらを.gitignoreファイルに入れて、必要に応じて手動でコピーします。

したがって、スケルトンファイル名はgitにあり、無視ファイル名はgitにはありません(ただし.gitignoreにあります)。このように、「テンプレート」から「実際の」(おそらくスケルトンよりも良い名前)にそれらをコピーする手動のステップが実行されると、それらはすぐに無視されます。


1
最初にそれらをリポジトリに追加してから.gitignoreに追加する方法はありませんか?これにはファイルを含めるが、特定のコミット後などに変更を加えないという解決策があったらすばらしいでしょう。
2012年

1
@mklauber実行するまで無期限に保持したいgit rm <file>。目的はIE:config.phpファイルです。構成ファイルを保持したいのですが、データベースの資格情報が異なるため、クライアント間でデータベース資格情報を追跡したくありません。
相対

1
はい、railsのdatabase.ymlファイルに問題があります。スケルトンを保持し、それをコピーして変更します。
Michael Durrant

これらの「スケルトン」構成ファイルを作成した場合、それらを初期コミットに追加しますか?次に、ファイルを無視するように.gitignoreを変更しますか?実質的にはファイルをリポジトリに保持しますが、スケルトンとしてですか?
2012年

10
次の2つのオプションがあります。ファイルを追加してgit add file1編集します.gitignore。コミットされたファイルはそこに残り、更新されません。または:ファイルを.gitignoreに追加してgit add --force file1から、ファイルを強制的に追加することができます。ファイルを上書きする必要があるときはいつでも、2番目のオプションを使用できます
klaustopher

1

与えられた答えは問題を部分的に解決することですが、さらに多くの問題を導入しています。

「Web.Local.config」ファイルを保存する必要がありました。私のために働いた唯一の解決策は次のことでした:

1.プロジェクトからファイルを除外する

2.ファイルの別のコピーをWeb.LocalTemplate.configとして作成します。

「Web.LocalTemplate.config」がGitによって追跡されるようになったので、すべての開発者がこれを開始点として使用できます。ただし、プロジェクトに含まれていない「Web.Local.config」は自動的に無視されます。


どのようにしgit update-index --skip-worktree FILENAMEて問題を部分的に解決するか、さらに問題を追加するだけですか?それはあなたがやろうとしていることを正確に解決します。やってみましたか?
アミールアシラフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.