Gitリポジトリからファイルを削除するにはどうすればよいですか?


1924

という名前のファイル"file1.txt"をGitリポジトリに追加しました。その後、私は、それを犯したと呼ばれるディレクトリのカップルの追加dir1とをdir2、とGitのリポジトリにそれらを約束しました。

今現在のリポジトリがあり"file1.txt"dir1dir2。どのように私は削除することができます"file1.txt"ように、他の人に影響を与えずdir1dir2


85
git rm正解ですが、ファイルは履歴に残ります。機密情報が含まれているためにファイルを削除したい場合は、もっと徹底的な何かをする必要があります。(特に、既にプッシュしたコンテンツの変更履歴は抜本的なアクションであり、可能であれば回避する必要があります。)
キース・トンプソン

8
注:GitHubでは、Webインターフェースからファイルを直接削除できるようになりました(リポジトリを複製する必要もありません)。以下の私の答えを参照しください。
VonC 2013

4
@KeithThompson私が必死にそれをしたい場合、どのようなステップになるでしょうか?
lessthanl0l


回答:


3224

を使用しgit rmます。

Gitリポジトリとファイルシステムからファイルを削除する場合は、次のコマンドを使用します。

git rm file1.txt
git commit -m "remove file1.txt"

ただし、ファイルをGitリポジトリからのみ削除し、ファイルシステムからは削除しない場合は、次のコマンドを使用します。

git rm --cached file1.txt
git commit -m "remove file1.txt"

変更をリモートリポジトリにプッシュするには

git push origin branch_name  

93
また便利:git rm -r directory //ディレクトリとコンテンツを削除するには
Reg

10
ただし、他のコミットでそのファイルが削除されるわけではありません。
VaTo

6
@SaulOrtega:その通りです。以前のコミットからファイルを削除するには(過去の履歴を変更)、GitHubのヘルプページの「機密データの削除」を参照してください。
グレッグヒューギル2015年

15
これにより、ファイルもローカルで削除されることに注意してください。リポジトリから削除したいだけなら:git rm --cached file1.txt
Weston Ganger

5
そのファイルに機密情報(資格情報など)が含まれている場合は、それらの資格情報をすぐに変更する必要があることに注意してください。GitHubを引用するには、「GitHubへのコミットをプッシュしたら、そこに含まれるすべてのデータが危険にさらされていると考える必要があります。パスワードをコミットした場合は変更してください!キーをコミットした場合は、新しいパスワードを生成してください。」
c1moore 2016

608

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

ファイルをリポジトリから削除し、ローカルファイルシステムから削除しない場合は、次のコマンドを使用します。
git rm --cached file.txt

以下の正確な状況は、gitを使用してビジネスのWebサイトのバージョン管理を維持しているところですが、「mickey」ディレクトリは、CAD開発者とプライベートコンテンツを共有するためのtmpフォルダでした。彼が巨大なファイルを必要としたとき、私はリンクされていないプライベートディレクトリを作成し、そこにファイルをftpdしてブラウザー経由でフェッチできるようにしました。これを忘れて、後でgit add -AWebサイトのベースディレクトリからを実行しました。その後、git statusコミットが必要な新しいファイルを示しました。今、私はそれらをgitの追跡とバージョン管理から削除する必要がありました...

以下の出力例は、私に何が起こったのかを示してい.003ます。ここでは、誤ってファイルを削除しました。ありがたいことに、へのローカルコピーに何が起こったかは気にしません.003が、現在変更されている他のファイルのいくつかは、私がWebサイトに加えたばかりの更新であり、ローカルファイルシステムから削除されたのはすばらしいことです。"ローカルファイルシステム" =ライブWebサイト(優れたプラクティスではありませんが、現実です)

[~/www]$ git rm shop/mickey/mtt_flange_SCN.7z.003
error: 'shop/mickey/mtt_flange_SCN.7z.003' has local modifications
(use --cached to keep the file, or -f to force removal)
[~/www]$ git rm -f shop/mickey/mtt_flange_SCN.7z.003
rm 'shop/mickey/mtt_flange_SCN.7z.003'
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
#   modified:   shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git rm --cached shop/mickey/mtt_flange_SCN.7z.002
rm 'shop/mickey/mtt_flange_SCN.7z.002'
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.002
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
[~/www]$

更新:この回答はトラフィックを増やしているので、他のGit回答がいくつかの優れたリソースを共有していることをお伝えしたいと思いました。このページには、Gitをわかりやすく説明するグラフィックがあります。「プロのGit」本はオンラインで、私に多くのことができます。


6
git commit -m "Just removing file1.txt"次に、これを次のようにコミットする必要があります。リモートリポジトリがある場合は、のようなものでコミットをプッシュしますgit push origin master
ban-geoengineering 2014年

77

まず、git rm特に複数のファイルでを使用している場合は、ワイルドカードがgitコマンドではなくシェルによって解決されることを考慮してください。

git rm -- *.anExtension
git commit -m "remove multiple files"

ただし、ファイルがすでにGitHubにある場合は、(2013年7月以降) Web GUIから直接削除できます

リポジトリ内のファイルを表示し、上部のゴミ箱アイコンをクリックして、他のWebベースの編集と同じように削除をコミットするだけです。

次にgit pull、ローカルリポジトリで" "を実行すると、ファイルもローカルで削除されます。
これは、この回答をgit repoからファイルを削除する(迂回的な)方法にしますか?
(GitHubの上のファイルがあることは言うまでもありませんである「gitのレポ」で)


削除ボタン

(コミットはそのファイルの削除を反映します):

削除をコミットする

そしてちょうどそのように、それはなくなった。

これらの機能のヘルプについては、ファイルの作成移動名前変更削除に関するヘルプ記事を必ずお読みください。

注:これはバージョン管理システムであるため、後でファイルを復元する必要がある場合は、Gitが常にサポートします。

最後の文は、削除されたファイルが履歴の一部であることを意味し、十分に簡単に復元できます(ただし、GitHub Webインターフェースではまだできません)。

Gitリポジトリで削除されたファイルを復元する」を参照してください。


4
一番下までスクロールし、[変更をコミット]をクリックして削除をコミットする必要があります!
LevinsonTechnologies

1
これは大きなテキストファイルでは機能しません。スクリーンショットのようにサーバーがファイルをレンダリングしようとすると、500エラーで失敗します。
CapeCoder 2016

9
この回答はgithubに関するものであり、質問はgitリポジトリに関するものです。githubインターフェースの使い方ではありません。
Peter Marshall

65

これは私のために働いた唯一のオプションです。

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch *.sql'

注:* .sqlをファイル名またはファイルタイプに置き換えます。これはすべてのコミットを通過し、このファイルタイプをリッピングするため、非常に注意してください。

編集:注意してください-このコマンドの後はプッシュまたはプルできません-「無関係の履歴」の拒否が表示されます 'git push --force -u origin master'を使用してプッシュまたはプルできます


9
これは素晴らしい回答ですが、他の回答とは異なり、このコマンドはコミット履歴を書き換え、パターンに一致するファイルのすべてのトレースを削除することに注意してください。これは、機密情報を誤ってコミットしたことがわかった場合に特に便利です(必要に応じて、-forceを使用して、プッシュされたリモートリポジトリの履歴を書き換えることができます)。
yoniLavi 2015

3
それはまさに私が抱えていた問題であり、それを正しくするためにはいくつかの試行錯誤が必要でした。私が一緒に働いていた男は、多くの多くのコミットを経て、いくつかの大きなデータベースダンプをリポジトリにコミットしていました。これが、例で.sqlを使用した理由です。私のリポジトリは肥大化し、巨大になったため、githubはもうプッシュを受け入れません。
Jason Glisson、2015年

3
リモートマスターを使用している場合は、コミットを強制してプッシュする必要がありますgit push --force -u origin master
AlbertMarkovski

2
@AlbertMarkovskiすみません、私は具体的ではありませんでした。リポジトリがサイズ制限を超えていたため、Githubは実際にはプッシュを受け入れませんでした。少なくとも数GB。彼らは私を断ち切り、それについて私にメールした。そのため、残念なことに、その時点でプッシュを強制することは役に立ちません。
Jason Glisson

2
@JasonGlisson偶然にビデオがリポジトリに追加されたという問題にも直面しました。
AlbertMarkovski 2016

34

さらに、それが削除するフォルダーであり、その後の子フォルダーまたはファイルである場合は、次を使用します。

git rm -r foldername

2
これもローカルからフォルダを削除します!Use git rm --cached -r <foldername>
Axis

24

より一般的にgit helpは、次のような簡単な質問に役立ちます。

zhasper@berens:/media/Kindle/documents$ git help
usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [--help] COMMAND [ARGS]

The most commonly used git commands are:
   add        Add file contents to the index
   :
   rm         Remove files from the working tree and from the index

6
より複雑なものについては、私はgit help混乱しますが、単純なものには適しています:)
James Polley

9
「インデックス」はgit noobsが精通している概念ではないため、実際にはgit noobsにはそれほど適していません。私はgit noobであるという個人的な経験から話します:)また、インデックスからrm 削除するのではなく、削除するためにファイルをステージングすることは、混乱しにくいと感じます(ただし、noobsにはまだ意味がありません)。
Roman Starkov 2013

romkynsに同意する:「作業ツリーとインデックスからファイルを削除する」という説明は、リポジトリからファイルを削除する方法のように聞こえません。多分私がGitをよりよく理解しているなら 代わりに、単にファイルのステージングを解除している(そしてオプションで作業ツリーからファイルを削除している-それは必然的にリポジトリに影響を与えるでしょうか?)
LarsH

14

リポジトリからファイルを削除したいが、ファイルシステムに残したい場合(追跡されなくなります):

bykov@gitserver:~/temp> git rm --cached file1.txt
bykov@gitserver:~/temp> git commit -m "remove file1.txt from the repo"

ファイルをリポジトリおよびファイルシステムから削除する場合は、2つのオプションがあります。

  1. ファイルにインデックスにステージングされた変更がない場合:

    bykov@gitserver:~/temp> git rm file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    
  2. ファイルに変更がインデックスにステージングされている場合:

    bykov@gitserver:~/temp> git rm -f file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    

12

git rm 今後はこのブランチのファイルのみが削除されますが、履歴には残り、gitはそれを記憶します。

git filter-branch他の人がここで述べたように、それを行う正しい方法はを使用することです。ブランチの履歴のすべてのコミットを書き換えて、そのファイルを削除します。

しかし、それを行った後でも、reflog、リモート、タグなどでそれへの参照が存在する可能性があるため、gitはそれを記憶できます。

ワンステップで完全に消去したい場合は、 git forget-blob

https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

簡単ですgit forget-blob file1.txt

これにより、すべての参照が削除され、実行されgit filter-branch、最後にgitガベージコレクターgit gcが実行されて、リポジトリ内のこのファイルが完全に削除されます。


10

rmコマンドを使用してローカルフォルダーからファイルを削除し、リモートサーバーに変更をプッシュする場合の別の方法。

rm file1.txt

git commit -a -m "Deleting files"

git push origin master

10

注:gitからのみファイルを削除する場合は、以下を使用してください:

git rm --cached file1.txt

ハードディスクからも削除したい場合:

git rm file1.txt

フォルダーを削除する場合は(フォルダーにファイルがいくつか含まれている可能性があります)、次のように再帰コマンドを使用して削除する必要があります。

git rm -r foldername

別のフォルダ内のフォルダを削除したい場合

git rm -r parentFolder/childFolder

その後、することができますcommitし、pushいつものように。ただし、削除されたフォルダを復元したい場合は、次のようにすることができます:gitから削除されたファイルを復元することは可能です。

ドキュメントから:

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…​

オプション

<file>…​

Files to remove. Fileglobs (e.g. *.c) can be given to remove all matching files. If you want Git to expand file glob characters, you

それらをシェルエスケープする必要があるかもしれません。先頭のディレクトリ名(たとえば、dir / file1とdir / file2を削除するためのdir)を指定して、ディレクトリ内のすべてのファイルと再帰的にすべてのサブディレクトリを削除できますが、これには-rオプションを明示的に指定する必要があります。 -f --force

Override the up-to-date check.

-n --dry-run

Don’t actually remove any file(s). Instead, just show if they exist in the index and would otherwise be removed by the command.

-r

Allow recursive removal when a leading directory name is given.

--

This option can be used to separate command-line options from the list of files, (useful when filenames might be mistaken for

コマンドラインオプション)。 --cached

Use this option to unstage and remove paths only from the index. Working tree files, whether modified or not, will be left alone.

--ignore-unmatch

Exit with a zero status even if no files matched.

-q --quiet

git rm normally outputs one line (in the form of an rm command) for each file removed. This option suppresses that output.

詳しくは公式ドキュメントをご覧ください。


7

特定のファイルを削除するには

git rmファイル名

追跡されていないすべてのファイルをディレクトリから単一ショットで再帰的にクリーニングするには

git clean -fdx


5

GitHub for Windowsアプリケーションがある場合、5つの簡単なステップでファイルを削除できます。

  • [同期]をクリックします。
  • ファイルが置かれているディレクトリをクリックし、ファイルの最新バージョンを選択します。
  • ツールをクリックし、「ここからシェルを開く」を選択します。
  • シェルで、「rm {filename}」と入力してEnterキーを押します。
  • 変更をコミットして再同期します。

5

私の場合、いくつかのコミット後にgithub上のファイルを削除しようとしましたが、コンピュータに保存しました

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch file_name_with_path' HEAD
git push --force -u origin master

後でこのファイルは無視されました


3
  1. まず、ローカルリポジトリからファイルを削除します。

    git rm -rファイル名

    または、ローカルリポジトリからのみファイルシステムからファイルを削除します

    git rm --cachedファイル名

  2. 次に、変更をローカルリポジトリにコミットします。

    git commit -m "unwanted files or some inline comments"   
    
  3. 最後に、ローカルの変更をリモートリポジトリに更新/プッシュします。

    git push 
    

これにより、誤って追加およびプッシュされたファイルに関連するすべてが削除されますか?
18

1

提案されたオプションをたくさん試しましたが、どれも動作しないように見えました(さまざまな問題はリストしません)。私がやったことは、うまくいき、シンプルで直感的でした(私にとって):

  1. ローカルリポジトリ全体を別の場所に移動する
  2. マスターからローカルドライブに再度リポジトリを複製します
  3. #1の元のコピーから#2の新しいクローンにファイル/フォルダーをコピーします。
  4. 問題の大きなファイルがそこにないか、.gitignoreファイルで除外されていることを確認してください
  5. 通常のgit add / git commit / git pushを実行します

1

リポジトリからファイルを削除した後、BFG Repo-Cleanergit rm使用して、ファイルをリポジトリ履歴から完全かつ簡単に消去できます。


0

「変更されたファイル」リストを汚染したくないため、誤ってリポジトリに入れたobjファイルとbinファイルがあります

彼らがリモートに行ったことに気付いた、これを次のように追加して無視しました.gitignore

/*/obj
/*/bin

問題は、それらがすでにリモートにあり、それらが変更されると、変更されたときにポップアップし、変更されたファイルリストを汚染することです。

それらの表示を停止するには、リモートリポジトリからフォルダ全体を削除する必要があります。

コマンドプロンプトで:

  1. CDからrepoフォルダー(つまりC:\repos\MyRepo
  2. SSIS \ objを削除したい。トップレベルでしか削除できないようですので、SSISにCDする必要があります:(つまりC:\repos\MyRepo\SSIS
  3. 魔法の呪文をタイプしてください git rm -r -f obj
    • rm = remove
    • -r =再帰的に削除
    • -f =力を意味します、あなたは本当にそれを意味します
    • objはフォルダーです
  4. 今すぐ実行 git commit -m "remove obj folder"

13個のファイルが315222削除されたという警告メッセージが表示されました

次に、CMD行を調べる必要がなかったので、Visual Sstudioに移動し、Syncを実行してリモートに適用しました。


0

決定された拡張子からファイルを削除する必要がある場合(たとえば、コンパイルされたファイル)、次のようにしてそれらを一度にすべて削除できます。

git remove -f *.pyc

0

ドキュメントによると。

git rm --cached giant_file

機密データに関しては、ファイルを削除したと言うのではなく、最新の既知のコミットに含めるだけです。

0.最後のコミットを修正

git commit --amend -CHEAD

すべてのgit履歴からファイルを削除する場合は、ドキュメントに従って次の手順を実行する必要があります。

1.ローカル履歴から削除します

git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \  --prune-empty --tag-name-filter cat -- --all
# Replace PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA with the path to the file you want to remove, not just its filename
  1. このファイルを.gitignoreに含めることを忘れないでください(パスワードなど決して共有したくないファイルの場合):
echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore
git add .gitignore
git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"

3.リモートから削除する必要がある場合

git push origin --force --all

4.タグリリースからも削除する必要がある場合:

git push origin --force --tags

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