2012-04-19 13 views
10

私がしたいことは既にthat questionに記載されています。しかし、私は実用的かつより一般的な方法でその問題を解決したい。だから、ユースケースは以下の通りです:ローカル変更をgitでコミットしないようにするための実際のワークフローは何ですか?

  • 私はいくつかのファイルweb.configcreateDb.sqlまたは任意の他のいくつかのローカルな変更を持って
  • 変更は私の地元に固有のものですので、私は、それらのファイルをコミットしたくありませんマシンのみ
  • バージョンを制御しなければならない、しかも変更はかなり頻繁に(特にSQLスクリプト)の一部に作られていますので、私は、私はコミットしたいです
  • それらのファイルの更新を受信したいこれらのファイルすべて 他のファイル
  • は、私は1つのコマンドでは、摩擦なしにそれを行うことができるようにしたい(POSH-gitのを使用して、そうPowerShellは大歓迎です)

ソリューションgit add -pを使用するように言ったに連結し、それは、ではありません実用的な、それはいつも手動でチャンクを選ぶのは退屈ですか、それとももっと便利な方法がありますか?例えば

、次のいずれかが仕事ができる:

  • 、インデックスにgit -add -A -EXCEPT web.config crateDb.sqlのようなものを追加する前に、自分の作業コピーにあるファイルをフィルタリングする機能があるかどうか。それから、gitエイリアスをマップすることができます。
  • stashを解除する機能がある場合。私は、作業コピーから1つの特定のstashに含まれている変更を削除することを意味します。ですから、コミットする前にgit stash -deapplyのようなことをする必要があります。

問題は非常に一般的であり、現時点では解決策がないことは奇妙です。例えば。 TortoiseSVNには「コミット無視」機能があり、Perforceはそのタイプのローカル変更を個別のチェンジリストに保存し、それを送信することはできません。

どのような考えですか?

+0

変更をコミットする以外にどのようにこれらのファイルを「バージョン管理する」ことができますか? gitでは、_is_ localをコミットし、_push_は他のコンピュータ/ reposに影響を与えます。私にとっては、これはより良い解決策のようなものです。[this](http://stackoverflow.com/questions/6009/how-do-you-deal-with-configuration-files-in-source-control)のようなものです。 –

+0

私は設定ファイル - [NConifig](https://github.com/Yegoroff/NConfig)のためのより良い解決策を持っていますが、設定ファイルだけでなく、問題もあります。 – Restuta

答えて

10

あなたのgitのコミット前に、以下を実行することを試みることができる:

git update-index --assume-unchanged web.config crateDb.sql 

gitのヘルプから:

--assume-変わらない

--no-assume-不変

これらのフラグが指定されている場合、 パスについて記録されたオブジェクト名は更新されません。代わりに、これらのオプションが設定され、 はパスの "変更されていない"ビットを設定解除します。 "assume unchanged"ビットがオンの場合、gitは の変更可能な作業ツリーファイルのチェックを中止しますので、作業ツリーファイルを変更するときに手動でビットの設定を解除して gitに伝える必要があります。 lstat(2)システムコール(例えばcifs)が非常に遅いファイルシステム上で大きなプロジェクトを扱うときは、これは役に立ちます。

このオプションは、( は人跡未踏のファイルの場合と.gitignore何に似て)追跡ファイル内のコミットされていない変更は に粗いファイルレベルのメカニズムとして無視することができます。索引でこのファイルを変更するには、 が必要な場合は、Gitが(正常に)失敗します。コミット時にマージするとき。よって、 想定外のファイルがアップストリームで変更された場合は、状況を手動で処理するには が必要です。

+0

その後、gitはどのように動作しますか?それらのファイルはまだ追跡されますか?私は起こる更新を得るだろうか? – Restuta

+0

+1これは問題を解決します。 – ralphtheninja

+1

@Restutaファイルはgitによって引き続き追跡されますが、gitは変更されていても変更されていないと一時的にみなします。 git statusなどは、変更されたファイルを報告しません。コマンドを元に戻すには--no-assume-unchangedを使い、gitに変更を再度気にさせてください。 – ralphtheninja

関連する問題