Gitトラッキングからフォルダーを削除する


404

フォルダー(名前のアップロード)を追跡から除外する必要があります。走ってみた

git rm -r --cached wordpress/wp-content/uploads

その後、私は.gitignoreへのパスを追加しました

/wordpress/wp-content/uploads

しかし、実行git statusすると、削除されたように表示されます。変更をコミットしようとすると、追跡から削除されるだけでなく、ファイルも削除されます。

何が悪いのですか?

私も試しました

git update-index --assume-unchanged <file>

しかし、これはファイルのみを追跡しないようです。しかし、追跡からフォルダー全体(サブフォルダーを含む)を削除する必要があります。


削除しても、gitがファイルを削除するわけではありません。ただし、を使用する場合は使用reset --hardします。
ケルター2014年

2
@keltarが言及しているように、コミットしてもファイルは削除されません。Gitからの削除はコミットされますが、作業コピーにはまだ含まれています。しかし、pull他の場所でコミットすると、それらのファイル新しいシステムから削除されます。
Chris

回答:


868

「追跡からのgitフォルダーの削除」をグーグル検索しているときにこの質問に遭遇しました。OPの質問は私に答えを導きました。ここでは、将来の世代のために要約します。

質問

ローカルマシン(開発環境など)からフォルダーを削除せずに、gitリポジトリからフォルダーを削除するにはどうすればよいですか?

回答

手順1.フォルダーパスをレポのルート.gitignoreファイルに追加します。

path_to_your_folder/

ステップ2.ローカルgitトラッキングからフォルダーを削除しますが、ディスクには残しておきます。

git rm -r --cached path_to_your_folder/

ステップ3.変更をgitリポジトリにプッシュします。

フォルダーはGitの観点から「削除」されたと見なされます(つまり、それらは過去の履歴にありますが、最新のコミットではありません。このリポジトリからプルした人​​はファイルをツリーから削除します)、作業ディレクトリには残ります。あなたが使用したので--cached


2
簡単な質問ですが、フォルダーパスは完全パスである必要がありますか?または、gitリポジトリがベースとして機能するパスだけですか?
HMSCelestia

私はそれが完全な道だと信じていますが、確かに覚えていません。
Tod Birdsall

7
「このリポジトリからプルすると、ファイルがツリーから削除されます」これを防ぐことはできますか?
レオガスパリーニ2017年

これはブランチ上の追跡から私のファイルを正しく削除しましたが、マージ後にそれらを削除しました!
ハロルド

1
私にとってはまだ残っています。また、フォルダにあるコミット時にこれらのファイルの選択を解除する必要がありますか?私は両方の方法を試しました。選択を解除すると、プッシュできませんが、追跡する必要がある別のファイルの1つの文字を変更しました。それでも
役に立た

44

これは私にとってはうまくいきます:

git rm -r --cached --ignore-unmatch folder_name

--ignore-unmatch ここで重要です。そのオプションがないと、gitはインデックスにない最初のファイルでエラーで終了します。


unknown option 'ignore unmatched'
イニゴ

ディレクトリが空の場合、これは重要なフラグです。ありがとうございます!
MNN、

:あなたはあまりにもディレクトリから特定のファイル拡張子を削除したい場合に非常に便利git rm -r --cached --ignore-unmatch .idea/*.xml
takanuva15

14

ディレクトリを忘れて再帰的に/*/*パスに追加するには:

git update-index --assume-unchanged wordpress/wp-content/uploads/*/*

使用することgit rm --cachedはコラボレーションに適していません。詳細はこちら:追跡を停止してGit内のファイルへの変更を無視する方法


1
これは非常にエレガントなソリューションです!再帰パストリックは私の日を救った。ありがとう!
アジズアルト

8

私はこれが古いスレッドであることを知っていますが、マークされた解決策では問題が解決しなかったため、少し追加したいと思いました(何度も試しましたが)。

フォルダーを追跡するgitフォームを実際に停止できる唯一の方法は、次のことを実行することでした。

  1. ローカルフォルダーのバックアップを作成し、安全な場所に置きます。
  2. ローカルリポジトリからフォルダを削除します
  3. キャッシュがクリアされていることを確認してください git rm -r --cached your_folder/
  4. your_folder/.gitignoreに追加
  5. 変更をコミットする
  6. バックアップをリポジトリに追加して戻します

これで、フォルダーが追跡されなくなったことがわかります。

キャッシュをクリアしただけではうまくいかなかった理由を聞かないでください。私はGitスーパーウィザードではありませんが、この方法で問題を解決しました。


ありがとうございました!!!Gitは私をeclipse .metadataフォルダーを無視しないで狂わせていました。eclipse .metadataフォルダーを使用して手順を実行すると、最終的に機能しました。
MasterN8

5

gitドキュメントから:

あなたがしたいかもしれないもう一つの便利なことは、作業ツリーにファイルを保持するが、ステージング領域からそれを削除することです。つまり、ファイルをハードドライブに残しておき、Gitで追跡しないようにすることができます。これは、.gitignoreファイルに何かを追加するのを忘れて、誤って大きなログファイルや.aコンパイル済みファイルの束などをステージングした場合に特に便利です。これを行うには、-cachedオプションを使用します。

$ git rm --cached readme.txt

「-r」を含めないでください。


1
OPはすでに試しました--cached。この-rオプションは「再帰的」であり、このインスタンスに含める必要があります。
クリス

これは重宝しました。私はフォルダーでそれを行う方法を探していましたが、ファイルでそれを行う方法を確認しました。私はこのコメントをアップマークしています。
軽い
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.