Gitでファイルの変更の追跡を停止して無視するにはどうすればよいですか?


1731

いくつかの.csprojファイルを含むプロジェクトを複製しました。ローカルcsprojファイルがGitによって追跡されている(またはパッチを作成するときに表示される)必要はありませんが、プロジェクトでは明らかに必要です。

*.csprojLOCAL .gitignoreに追加しましたが、ファイルはすでにリポジトリにあります。

git statusと入力csprojすると、パッチの追跡または送信に関心がない変更が表示されます。

ステータスを実行(またはパッチを作成)したときに変更が表示されないようにするには、個人リポジトリからこれらのファイルの「追跡」を削除します(ただし、ソースに保持して使用できます)。

この状況を処理する正しい/正規の方法はありますか?


18
非常に便利な質問ですが、.csprojファイルへの変更を追跡したくない理由に興味があります。これは、プロジェクトの非常に重要な部分です。追跡することなく完全に理解できる.csproj.userファイルまたは任意の.Publish.XMLファイルに対する変更ですが、追跡したくない理由に興味をそそられます.csproj
Owen Blacker

7
多分彼らは別のIDEを使用していますか?
Jarrett、2013

3
皮肉なことに、リポジトリから.suoファイルを削除し、ローカルに保持しようとしているため、このスレッドに行きました。後世のために、.Net開発では.csprojファイルをリポジトリに保持する必要があります。プロジェクトの他の開発者の怒りを感じたくない場合を除き、これらの変更は常に追跡する必要があります。不明な場合は、GitHubのgitignoreファイルリポジトリを確認してください:github.com/github/gitignore/blob/master/VisualStudio.gitignore
longda

1
@Cupcake、あなたがリンクした質問は、この質問の15日後に書かれましたか?多分あなたは別のことを考えていますか?
スティーブンマードック2014年

@marflarの標準的な質問は、必ずしも最も古いものである必要はなく、最高の質問である必要があります。この1つは唯一の5ている間、私はにリンクされている1は、20点の答えを持っている

回答:


2129

git rm --cachedリビジョン管理から削除したい各ファイルを呼び出すだけで十分です。ローカルの無視パターンが正しい限り、これらのファイルがgit statusの出力に含まれることはありません。

このソリューションはリポジトリからファイルを削除するため、すべての開発者はファイルのローカル(リビジョン管理されていない)コピーを維持する必要があることに注意してください

gitがこれらのファイルの変更を検出しないようにするには、次のコマンドも使用する必要があります。

git update-index --assume-unchanged [path]

あなたがおそらくやりたいこと:@Ryan Taylorの回答の下から)

  1. これは、ファイルまたはフォルダーの独自の独立したバージョンが必要であることをgitに伝えるためです。たとえば、プロダクション/ステージング構成ファイルを上書き(または削除)したくありません。

git update-index --skip-worktree <path-name>

完全な回答はこのURLにあります。http//source.kohlerville.com/2009/02/untrack-files-in-git/


187
"git rm --cached <file>"は<file>をバージョン管理から削除し、作業リポジトリに保持します。それがあなたの望むものかどうか
JakubNarębskiJun

51
しかし、他の人がリポジトリをプルすると、独自の* .csprojファイルが削除されますか?それは、ファイルを追跡しないで削除したくない場合です。
FMaz008

23
ディレクトリ内のすべてのファイルを削除する場合は、それをgit ls-files:と組み合わせgit ls-files | xargs git rm --cachedます。これにより、実際のファイルを削除せずに、指定されたディレクトリのgitインデックスからすべてが削除されます。
Marco

129
git rm --cached -r <dir>フォルダーとその中のすべてのファイルを再帰的に処理します。
Chris K

41
これにより、ファイルの追跡が停止し、ローカルで保存されますが、プルしたユーザーは削除されます
Edward Newell

249

その場合はgit update-index --assume-unchanged file.csproj、Gitは自動的に変更file.csprojをチェックしません。あなたがそれらを変更するたびに、それはgitの状態にまで来て、それらを停止します。したがって、この方法ですべての.csprojファイルにマークを付けることができます。ただし、上流のリポジトリから送信される新しいファイルには手動でマークを付ける必要があります。(.gitignoreまたは.git/info/excludeにそれらがある場合、作成したものは無視されます)

.csprojファイルが何であるかは完全にはわかりません... IDE構成に沿ったものである場合(Eclipseの.eclipseおよび.classpathファイルと同様)、これらのファイルは単純にソース管理されるべきではないことをお勧めしますすべて。一方、それらがビルドシステム(Makefileなど)の一部である場合、それらは明確にすべきであり、オプションのローカル変更(たとえば、local.csprojからconfig.mk)を取得する方法が有用です。 :ビルドをグローバルパーツとローカルオーバーライドに分割します。


8
csprojはC#プロジェクトファイルであり、プロジェクトに含まれるファイルやその他のいくつかの構成を追跡します。プロジェクトが機能するためにはソース管理されている必要があります
SparK

4
これが唯一の正しい答えです。私は長年@araqnids回答を使用しており、この問題を解決するために要求どおりに機能します。
NHDaly 2014年

コマンドの引数の「ファイル」プレフィックスの意味は何ですか?なぜそれだけではないの.csprojですか?
GreenAsJade 2014年

1
これがファイルに対して行われたこと、またはこれがリポジトリで行われたファイルを検出する方法はありますか?自分がこれを行ったことを忘れて、なぜこのファイルが更新されないのか疑問に思っています。
GreenAsJade 2014年

4
@GreenAsJade:git ls-files -v変更されていないと想定されるファイルを小文字のインジケーターで表示します(たとえば、キャッシュされたファイルhでは通常でHはなく)。
アマダン2014年

238

3つのオプションがあり、おそらく#3が必要です

1。これによりローカルファイルは保持されますが、プルしたときに他のユーザーのために削除されます。

git rm --cached <file-name> または git rm -r --cached <folder-name>

2.これは最適化のためのものです。たとえば、SDKなど、多数のファイルが含まれるフォルダーはおそらく変更されません。巨大なフォルダには変更がないので、ローカルでの変更を毎回確認するのを停止するようにgitに指示します。assume-unchanged(あなたが引く)、ファイル/フォルダへのアップストリームの変更がある場合、インデックスがリセットされたファイル(複数可)に上書きされます。

git update-index --assume-unchanged <path-name>

3.これは、ファイルまたはフォルダーの独自の独立したバージョンが必要であることをgitに伝えることです。たとえば、プロダクション/ステージング構成ファイルを上書き(または削除)したくありません。

git update-index --skip-worktree <path-name>

それを知ることは重要です git update-index がgitで伝播ないこと、および各ユーザーがそれを個別に実行する必要がことです。


8
この答えは最も完全です-それはそれぞれの影響を持つさまざまなソリューションを提供します。私が使用している特定のケースでは、設定ファイルにパスワードが埋め込まれています。テンプレートファイルを伝達してから、パスワードをコピーに追加します。パスワード付きのコピーは無視して、上書きしないでください。
bmacnaughton 2016年

1
私のローカルで、どのファイルが「仮定されていない」または「スキップワークツリー」に適用されるかを確認するにはどうすればよいですか?
Supawat Pusavanno 2017

3
@SupawatPusavanno以前にこの回答のまま、仮定やスキップworktreeの一見のために選択されたどのファイルを見るためにstackoverflow.com/questions/42363881/... -それは使用grepしてgit ls-files
ライアン・テイラー

1
とても良い答えです。しかし、別のブランチに切り替えようとすると、gitはエラーをスローします:エラー:「次のファイルへのローカルの変更はチェックアウトによって上書きされます...」。解決策は、切り替える前に変更を隠しておき、あなたは枝に戻ってきます。
PhantomReference 2017

@RyanTaylor:私は最初に変更されていないものと仮定し(動作しませんでした)、worktreeコマンドをスキップしました(動作しませんでした)。しかしit gives me error that your local changes would be overwritten、これらの2つのファイルのgit origin repoからコードをもう一度プルすると、追跡が正しく行われませんか?
NeverGiveUp161

152

これは2段階のプロセスです。

  1. ファイル/フォルダの追跡を削除します-しかし、それらをディスクに保持します-使用

    git rm --cached 
    

    今、それらは「変更済み」として表示されませんが、それでも表示されます

        untracked files in  git status -u  
    
  2. それらを追加 .gitignore


56
いいえ、これはファイルを追跡から削除し、ローカルに保存しますが、を引っ張っ人は削除されます。
エドワードニューウェル

1
私の場合、誤って追跡したくないフォルダを追加したので、これが必要でした。
Sonny

4
はい、それは確かに尋ねられた質問に対する間違った答えです-しかし、それはおそらく、検索結果でこの質問を見つけるほとんどの人(私のような)にとって正しい答えです。
Andrew Spencer

95

受け入れられた答えはまだ私にとってはうまくいきませんでした

使った

git rm -r --cached。

git add。

git commit -m ".gitignoreの修正"

ここから答えを見つけた


そのリンクは、特に再帰的に.gitignore内のすべてのファイルを削除するために、非常に便利です
rmcsharry

9
私はここに3回戻ってきました。うまくいけば、次回までにメモリにコミットできます!
Harry Bosh

以下のように@Edwardニューウェルさんのコメント上記の答えはここにも適用されます: 『これは、追跡からファイルを削除しそれをローカルに保存し、しますが、それは引っ張る誰のために削除されることになり、』。
ToJo

47

.gitignoreを忘れましたか?

プロジェクト全体がローカルにあるが、追加するのを忘れてgit ignoreを実行して不要なファイルを追跡している場合は、このコマンドを使用してすべてを削除します

git rm --cached -r .

プロジェクトのルートにいることを確認してください。

その後、あなたはいつものことをすることができます

追加

git add .

コミット

git commit -m 'removed all and added with git ignore'

押す

git push origin master

結論

これが自分に変更を加えなければなら.gitignoreない、またはすべてを忘れてしまった人々を助けることを願っています。

  • キャッシュ全体を削除します
  • あなたの.gitignoreを見てください
  • 追跡するファイルを追加します
  • あなたのレポにプッシュ

4
削除または追加について話すとき、いつどこで言うかを忘れてしまいます。トラックリストから削除しますか?リポジトリから?ローカルプロジェクトスペースからですか?引っ張って削除しますか?コミット時?プッシュで?悲しいかな、ここのすべての著者は同じ問題を抱えています。
Gangnus 2016年

3
@Gangnusファイルが実際にディスクまたはリポジトリから削除されていないことは完全に明らかであるため、あなたがしようとしていることを誰も「明確化」したとは思わない。この回答は、コマンドの発生順を示しています。あなたのコメントが示唆するように、それは神秘的で説明が間違っているわけではありません。
アンソニー

以下のように@Edwardニューウェルさんのコメント上記の答えはここにも適用されます: 『これは、追跡からファイルを削除しそれをローカルに保存し、しますが、それは引っ張る誰のために削除されることになり、』。
ToJo

26

他の答えで指摘されているように、選択された答えは間違っています。

答えは別の質問には、それが必要とされるであろうスキップworktreeであることを示唆しています。

git update-index --skip-worktree <file>

2
いいえ、実際に--skip-worktreeはありません。ファイルをリポジトリに保存し、変更の追跡を停止するために使用されます。:あなたの答えが言うように、開発者がいるので、あなたが今まで特定のファイルに触れないようにgitの指示時に--skip-worktreeが有用である必要があり、それを変更する
Erdal G.

4
@ErdalG。丁度。質問によると、彼らはファイル内の変更を無視したいが、ファイルをリポジトリに保持したい
the_new_mr

@the_new_mrに同意、--assume-unchanged--skip-worktree同様の効果を有するが、その目的が全く異なっています。前者はgitをだまして特定のファイルをチェックしないようにすることでgitのパフォーマンスを高速化するためのもので、後者は特定のファイルに対する将来の変更無視するためのものです。
Victor Wong

22

時間を節約するために、.gitignoreに追加したルールを使用して、複数のファイル/フォルダーを削除できます。

git rm --cached app/**/*.xml

または

git rm --cached -r app/widgets/yourfolder/


これは、gitignoreを段階的に修正したい場合に非常に良い解決策です
cutiko

15

gitによるファイルの監視を防ぐには

git update-index --assume-unchanged [file-path]

そしてそれを元に戻すには

git update-index --no-assume-unchanged [file-path]

同様のユースケースを参照するためのリポジトリhttps://github.com/awslabs/git-secrets


1
元に戻すヒントは命の恩人でした、ありがとう!
Hamman Samuel

9

多くの人があなたに使うことを勧めます git update-index --assume-unchanged。確かに、これは良い解決策かもしれませんが、短期的にのみです。

あなたがおそらくやりたいことはこれです: git update-index --skip-worktree

(おそらく望まない3番目のオプションは次のとおりです。 git rm --cachedです。。ローカルファイルは保持されますが、リモートリポジトリから削除されたものとしてマークされます。)

最初の2つのオプションの違いは?

  • assume-unchangedファイルからの変更を一時的に非表示にすることができます。ファイルに対して行われた変更を非表示にし、ファイルを変更してから、別のブランチをチェックアウトする場合は、使用した変更を隠しておく必要がありますno-assume-unchanged
  • skip-worktree 変更を加えて、チェックアウトしたブランチを追跡します。

ユースケース assume-unchanged

これは、このファイルを変更してはならないことを想定しており、を実行するとより明確な出力が得られますgit status。ただし、別のブランチにチェックアウトするときは、フラグをリセットし、変更をコミットまたは隠しておく必要があります。このオプションを有効にしてプルする場合、競合を解決する必要があり、gitは自動マージしません。実際には変更のみを非表示にします(git statusフラグの付いたファイルは表示されません)。

しばらくの間変更の追跡を停止したい場合に使用します+ 同じ変更にgit commit -a関連する一連のファイル()をコミットします。

ユースケース skip-worktree

あなたは友達が彼らのセットアップに応じて変更しなければならないパラメータ(例えばパスワードを含む)を含むセットアップクラスを持っています。

  • 1:このクラスの最初のバージョンを作成し、他のフィールドを空にしたり空のままにしたりできるフィールドに入力します。
  • 2:コミットしてリモートサーバーにプッシュします。
  • 3: git update-index --skip-worktree MySetupClass.java
  • 4:独自のパラメーターで構成クラスを更新します。
  • 5:別の機能に戻ります。

行う変更は、ブランチに関係なく従います。警告:友達もこのクラスを変更したい場合は、同じ設定にする必要があります。そうでない場合、変更はリモートリポジトリにプッシュされます。プルすると、ファイルのリモートバージョンが上書きされます。

PS:望ましくない副作用が発生するため、どちらか一方を実行してください。両方を実行することはできません。別のフラグを試したい場合は、まず後者を無効にする必要があります。


7

ローカルファイル/フォルダーへの変更を追跡しないようにGitに指示するには(つまり、gitステータスでは変更が検出されない)、次のようにします。

git update-index --skip-worktree path/to/file

そして、Gitにローカルバージョンへの変更をもう一度追跡するように(変更をコミットできるように)するには、次のようにします。

git update-index --no-skip-worktree path/to/file

1

一行回答 git update-index --assume-unchanged [path]

中央リポジトリとローカルリポジトリにあるファイルがある場合は常にこれを使用します。そのファイルに変更を加える必要がありますが、中央リポジトリにステージング/コミットしないでください。このファイルは追加しないでください.gitignore。システム管理者がファイルに新しい変更を加えた場合、上級開発者はすべてのローカルリポジトリに配布する必要があります。

最適な例:DB接続の構成ファイル。中央リポジトリでは、本番DBサーバーの値を持つすべてのユーザー名、パスワード、ホスト、ポートを取得します。ただし、ローカル開発では、ローカルまたは他の開発DBサーバー(チームがセットアップしたもの)のみを使用する必要があります。この場合、設定ファイルを変更する必要がありますが、中央リポジトリにコミットしないでください。

ベスト


0

各ファイルを個別に選択するのではなく、特定のフォルダーまたはbinフォルダー内のすべてのファイルを削除する方法を尋ねていると想定しています。

このコマンドを使用できます

git rm -r -f /<floder-name>\*

。そのディレクトリの親ディレクトリにいることを確認してください。
このコマンドは、bin /またはbuild /フォルダーにあるすべてのファイルを再帰的に「削除」します。削除という言葉は、gitがそれらのファイルが「削除」されたように見せかけ、それらのファイルが追跡されないことを意味します。gitは実際にそれらのファイルを削除モードにマークします。

.gitignoreが次のコミットの準備ができていることを確認してください。
ドキュメント:git rm


0

操作の順序が原因で問題が発生する可能性があります。最初に.gitignoreを変更し、次にgit rm --cached xxxを変更した場合、この問題が引き続き発生する可能性があります。

正しい解決策:

  1. git rm --cached xxx
  2. .gitignoreを変更しました

順序不変!

変更後の.gitignoreリロード!


0

私はあなたがGit Tackから単一のファイルを削除しようとしていると想定しています。そのため、以下のコマンドをお勧めします。

git update-index --assume-unchanged

例-git update-index --assume-unchanged .gitignore .idea / compiler.xml


0

ディレクトリ内の(特定のタイプの)すべてのファイルへの変更を無視するには、これらのアプローチのいくつかを組み合わせる必要がありました。

以下の "excludedir"は、変更を監視しないディレクトリの名前です。

まず、変更追跡キャッシュから既存の新しいファイルを削除します(ファイルシステムから削除することはありません)。

git status | grep "new file:" | cut  --complement -d " " -f1-4 | grep "^excludedir" | xargs git rm --cache

同じことをで行うことができますmodified:。 新しいファイル名のrenamed:ポスト->ビットを確認し、以下で->説明するdeleted:ようにプリビットを実行する必要があるため、少し複雑です。

deleted: ローカルシステムに存在しないファイルのインデックスを更新するようには見えないため、ファイルは少し複雑であることがわかります

echo .deletedfiles >> .gitignore
git status | grep "deleted:" | cut  --complement -d " " -f1-4 | grep "^excludedir" > .deletedfiles
cat .deletedfiles | xargs -d '\n' touch
cat .deletedfiles | xargs -d '\n' git add -f
cat .deletedfiles | xargs -d '\n' git update-index --assume-unchanged
cat .deletedfiles | xargs -d '\n' rm

上記のリストの最後のコマンドは、ファイルシステムからファイルを再び削除するため、省略してもかまいません。

次に、そのディレクトリから変更追跡をブロックします

git ls-files excludedir/ | xargs git update-index --skip-worktree
git update index --skip-worktree excludedir/

0

この回答では、ほぼgitコマンドを使用しないアプローチが提供されまし

すべてのローカルリポジトリの特定のファイルを無視するには

  1. ファイルを作成~/.gitignore_globalすることにより、例えばtouch ~/.gitignore_global端末インチ
  2. git config --global core.excludesfile ~/.gitignore_global一度実行します。
  3. 無視するファイル/ディレクトリパスをに書き込みます~/.gitignore_global。たとえばmodules/*.H、作業ディレクトリにあると想定されます$WORK_DIR/modules/*.H

単一のローカルリポジトリの特定のファイルを無視するには

  1. .git/info/excludeリポジトリ内のファイルに対して上記の3番目の手順を実行します。つまり、無視するファイル/ディレクトリパスをに書き込みます.git/info/exclude。たとえばmodules/*.C、作業ディレクトリにあると想定されます$WORK_DIR/modules/*.C

0

現在/将来に.gitignoreを適用する

この方法は、標準の.gitignore動作を適用し、無視する必要があるファイルを手動で指定する必要がありません

--exclude-from=.gitignoreもう使用できません:/-更新されたメソッドは次のとおりです:

一般的なアドバイス:クリーンなリポジトリから始めてください -すべてがコミットされ、作業ディレクトリまたはインデックスで何も保留されておらず、バックアップを作成してください!

#commit up-to-date .gitignore (if not already existing)
#this command must be run on each branch
git add .gitignore
git commit -m "Create .gitignore"

#apply standard git ignore behavior only to current index, not working directory (--cached)
#if this command returns nothing, ensure /.git/info/exclude AND/OR .gitignore exist
#this command must be run on each branch
git ls-files -z --ignored --exclude-standard | xargs -0 git rm --cached

#optionally add anything to the index that was previously ignored but now shouldn't be:
git add *

#commit again
#optionally use the --amend flag to merge this commit with the previous one instead of creating 2 commits.

git commit -m "re-applied modified .gitignore"

#other devs who pull after this commit is pushed will see the  newly-.gitignored files DELETED

新しく無視されたファイルをブランチのコミット履歴からも削除する必要がある場合、または新しく無視されたファイルを今後のプルから削除しない場合はこの回答を参照してください。


-1

長い間検索した後、これを行う方法を見つけます。.gitconfigAndroid Studioプロジェクトの.likeでgitコマンドのエイリアスを設定します。チェックアウトブランチの前に構成ファイルを元に戻してからスキップしsedます。チェックアウトブランチの後で、構成ファイルをローカル構成に変更します。 checkoutandmodifylocalproperties = !git update-index --no-skip-worktree local.properties && git checkout local.properties && git checkout $1 && git update-index --skip-worktree local.properties && sed -i '' 's/.*sdk.dir.*/sdk.dir=\\/Users\\/run\\/Library\\/Android\\/sdk/g' local.properties && :

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.