ローカルファイルシステムから削除せずにGitリポジトリからファイルを削除する


3047

私の最初のコミットにはいくつかのログファイルが含まれていました。をに追加*logしました.gitignore。次に、リポジトリからログファイルを削除します。

git rm mylogfile.log

リポジトリからファイルを削除しますが、ローカルファイルシステムからも削除します。

ファイルのローカルコピーを削除せずに、このファイルをリポジトリから削除するにはどうすればよいですか?



14
最も賛成された回答は一部の人にとって危険であることは注目に値します。あなたがお住まいの地域を押したときに比べて、リモートリポジトリを使用している場合、あなたはgitのから削除別の場所に引っ張って、それらのファイルは削除されます。これは返信の1つで言及されていますが、コメントされていません。
RichieHH 2018

回答:


4354

manファイルから:

ときに--cached指定され、段階的な内容は、ファイルがちょうどインデックスから削除することができるように、枝の先端またはディスク上のファイルのいずれかと一致する必要があります。

したがって、単一のファイルの場合:

git rm --cached mylogfile.log

そして単一のディレクトリの場合:

git rm --cached -r mydirectory

151
ほど自明ではないため、見落としがちsvn rm --keep-localです。
マーティン

114
しかし、どうすればリモートサーバー上のファイルを保持できますか?これにより、ローカルのサーバーは保持されますが、別のサーバーからプッシュおよびプルすると、ファイルが削除されます。また、ファイルに.gitignoreを追加しましたが、それでも削除されます
spankmaster79

6
これgit pullは、コミット後のファイルを削除しますgit rm
Petr Peller

9
注目に値するのは、回答でコマンドを実行した後、git commit -m "Commit message"およびを使用する必要があることgit pushです。他に段階的な変更がある場合は(で確認git status)、それらもこの時点でコミットされます。
シンジャイ2017

9
これは最も受け入れられた答えであり、実行しないので、何が求められているのか、私が何をすべきかを説明します。コマンドを使用してgit rm --cached mylogfile.log、リポジトリからファイルを削除します。本番システムでファイルが失われるのを防ぐために、ファイルのバックアップを作成し、この後にプルします。前述のようにファイルは削除され、バックアップからコピーして戻す必要があります。これはかなりの苦痛ですが、私はこの問題のより良い解決策を見つけられませんでした。
Marcel Grolms、2017

275

フォルダー全体(Resharperファイルなど)をリポジトリから削除するには、次のようにします。

git rm -r --cached folderName

私はいくつかのリシャーパーファイルをコミットしましたが、それらを他のプロジェクトユーザーのために保持したくありませんでした。


13
今後の訪問者への追加のメモ:コミットをリポジトリに「同期」するためにGUIを使用しないでください。これにより、ファイルがローカルリポジトリに戻されます。Git Push repo branchリモートからファイルを実際に削除するには、aを実行する必要があります。
RubberDuck、2014

211

ローカルファイルシステムからファイルを削除せずに、.gitignoreに基づいてリポジトリからファイルを削除することもできます。

git rm --cached `git ls-files -i -X .gitignore`

または、Windows Powershellの場合:

git rm --cached $(git ls-files -i -X .gitignore)

7
Windowsでは動作しません。git ls-files -i -X .gitignoreは機能しますが、ファイルを「git rm」に送信する方法がわかりません。それを行う方法を知っていますか?
エリックZ

17
cmd-consoleの代わりにGit Bashを使用する場合、Windowsで動作します
Andreas Zita

17
これが大好き。ファイル名にスペースが含まれるファイルがいくつかあったことを除いて、機能しました。ここで解決策をこれに変更しました:git ls-files -i -X .gitignore | xargs -I{} git rm --cached "{}"。持っている素晴らしいツールですので...、ここでは答えにこのソリューションを変更または追加することを検討してください
mpettis

私は試しませんでしたが.gitkeep、リポジトリ内の空のフォルダを保持するようなファイルも削除するかどうかテストする必要があります。例えば。.gitignoreフォルダuploadsを含み、リポジトリはを追跡することを強制されます.gitkeep。その下のレポからすべてuploadsを削除することによっても削除されます.gitkeep
Vladimir Vukanac 16

この提案はpowershellで完全に機能しました:git rm --cached $(git ls-files -i -X .gitignore)
geekandglitter

89

ここの私の回答に従って:https : //stackoverflow.com/questions/6313126/how-to-remove-a-directory-in-my-github-repository

ローカルからではなく、gitリポジトリからのみフォルダー/ディレクトリまたはファイルを削除するには、3つの簡単な手順を試してください。


ディレクトリを削除する手順

git rm -r --cached File-or-FolderName
git commit -m "Removed folder from repository"
git push origin master

次のコミットでそのフォルダーを無視する手順

次のコミットからそのフォルダーを無視するには、ルートに.gitignoreという名前のファイルを1つ作成し 、そのフォルダー名をその中に入れます。好きなだけ置くことができます

.gitignoreファイルは次のようになります

/FolderName

ディレクトリを削除


@gaurav助けてくれてうれしい!
eirenaios

69

また、機密データ(パスワードを含むファイルなど)をコミットした場合は、リポジトリの履歴から完全に削除する必要があります。これを行う方法を説明するガイドは次のとおりです。http//help.github.com/remove-sensitive-data/


13
この回答には、別のWebサイトにリンクするのではなく、このタスクを完了するために必要なコマンドを含める必要があります。
Florian Lemaitre

1
また、git bfg repoクリーナーツールを使用する方が簡単で高速であることがわかりました。
Lubed Up Slug

64

より一般的なソリューション:

  1. .gitignoreファイルを編集します。

    ECHO mylogfile.log >> .gitignore

  2. インデックスからすべてのアイテムを削除します。

    git rm -r -f --cached .

  3. インデックスを再構築します。

    git add .

  4. 新しいコミットをする

    git commit -m "Removed mylogfile.log"


2
これは実際にファイルを削除しますか?
Mr_and_Mrs_D 2013

6
GitHubから?番号。既にgithubにプッシュしている場合は、サイトから削除されません。ただし、ローカルのgitリポジトリが更新されます。
mAsT3RpEE 2013

5
あなたが削除したコメントは実際にはより削除されました:)解決策の問題は、誰かrm --cashedが引っ張ったときに最終的にファイルを削除するということです?そして、これは「ローカルファイルシステムからファイルを削除せずにリポジトリからファイルを削除する」と言ったときに必要なことではありません。さて、なぜ上記の解決策が受け入れられなかったのでしょうか。おそらく、OPは単独で機能し、プルされなかったのでしょうか。ダンノ。私はgithubの「一度プッシュすると常にそこにある」問題を理解しています
Mr_and_Mrs_D

github自体に質問しない限り、100%の解決策はないと思います。とりあえずこれに固執する。ファイルのコピー、gitignoreへの追加、実際のgit rm -rの実行、ファイルのコミット、プッシュ、復元。別の解決策を見つけることができましたか?
mAsT3RpEE 2013

9
私の問題はgithubではありません- 同僚がプルするとファイルが実際に削除されるということです。私はしていないファイルを削除することにしたいです。これは私に過去に大きな問題を引き起こしました。だから本当にファイルを削除しない解決策が本当にあるのかと思っていました。コメントの旅館にも受け入れられた答えを参照してください。stackoverflow.com/questions/1143796/...
Mr_and_Mrs_D

24

Gitでは、これらのファイルが変更されていないと想定して、それらのファイルを無視できます。これは、git update-index --assume-unchanged path/to/file.txtコマンドを実行することによって行われます。ファイルをそのようにマークすると、gitはそのファイルの変更を完全に無視します。git statusまたはgit diffを実行しても表示されず、コミットされることもありません。

https://help.github.com/articles/ignoring-filesから)

したがって、それを削除するのではなく、永久に変更を無視します。これはローカルでのみ機能すると思います。そのため、同僚は上記と同じコマンドを実行しない限り、変更を見ることができます。(ただし、これを確認する必要があります。)

注:これは質問に直接回答するのではなく、他の回答のコメントにあるフォローアップの質問に基づいています。


2
うーん、私はこれを行いますが、誰かがリポジトリで変更を加えた場合、ファイルが上書きされる可能性があることがわかります。
AlxVallejo 2014

17

ファイルを追跡解除し、ローカルおよびリモートのリポジトリから削除しない場合は、次のコマンドを使用します。

git update-index --assume-unchanged  file_name_with_path

2
これは良い答えですが、人々が通常Gitでその単語を使用するという意味で、これはファイルを「追跡解除」しないことに注意することが重要です。 。この答えは、ファイルをリポジトリに保持しますが、Gitが変更が加えられたことに気付かないようにすることです。これにはいくつかの重要な違いがあります-最も重要なこととして、ファイルは他のユーザーのためにまだ存在します、そして誰か他の人がそれに変更を加えてプルした場合、ローカルコピーは確認なしに上書きされる可能性があります。
Soren Bjornstad

8

上記の答えは私にはうまくいきませんでした。以前filter-branchはすべてのコミット済みファイルを削除していました。

gitリポジトリからファイルを削除するには:

git filter-branch --tree-filter 'rm  file'

次のコマンドを使用して、gitリポジトリからフォルダーを削除します。

git filter-branch --tree-filter 'rm -rf directory'

これにより、すべてのコミットからディレクトリまたはファイルが削除されます。

次を使用してコミットを指定できます。

git filter-branch --tree-filter 'rm -rf directory' HEAD

または範囲:

git filter-branch --tree-filter 'rm -rf vendor/gems' t49dse..HEAD

すべてをリモートにプッシュするには、次のようにします。

git push origin master --force

2
これと組み合わせてgit rm -r --cached NAME、ローカルのgitリポジトリから削除し、後で引っ張る人に影響を与えないようにします(gitからファイルまたはディレクトリの履歴を削除することにより)
notbad.jpeg

1
これはgitの履歴を書き換えるので、-forceをプッシュする必要があります。これは、私が推測する質問では少し範囲外です。公共の有名なリポジトリでは、すでにそのリポジトリを複製しているすべての人がプルするときに問題が発生するため、このように履歴行を変更することはできません。
Guillaume Perrot 2017

0

ファイルを無視し、ファイルをgitから削除し、gitを更新します(削除用)。

注:これは機密情報の履歴には対応していません。

このプロセスは、gitで何が行われているのかを理解するのに間違いありません。時間をかけて、それを得て、私は次のようなプロセスを実行することを学びました:

1)ファイルを無視する

  • .gitignoreそれらを無視するためにプロジェクトを追加または更新します-あなたのような多くの場合、親ディレクトリは、例えばlog/使用する正規表現になります。
  • .gitignoreファイルの変更をコミットしてプッシュします(プッシュが必要かどうかはわかりませんが、行っても害はありません)。

2)gitからファイルを削除します(のみ)。

  • git(のみ)からファイルを削除します git remove --cached some_dir/
  • それらがローカルに残っていることを確認してください(そうするべきです!)。

3)その変更を追加してコミットします(本質的に、混乱を招く「add」コマンドにもかかわらず、これは「add」の変更によるものの削除です)。

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