Gitリポジトリで複数の削除されたファイルを削除する方法


236

一部のファイルを削除しましたが、gitステータスは次のように表示されます。

私はコミットしてプッシュしました。

GitHubは、リポジトリ内の削除されたファイルを引き続き表示します。GitHubリポジトリ内のファイルを削除するにはどうすればよいですか?

# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   deleted:    modules/welcome/language/english/kaimonokago_lang.php
#   deleted:    modules/welcome/language/french/kaimonokago_lang.php
#   deleted:    modules/welcome/language/german/kaimonokago_lang.php
#   deleted:    modules/welcome/language/norwegian/kaimonokago_lang.php

を使用するgit rmと、次のようになります。

usage: git rm [options] [--] <file>...

-n, --dry-run         dry run
-q, --quiet           do not list removed files
--cached              only remove from the index
-f, --force           override the up-to-date check
-r                    allow recursive removal
--ignore-unmatch      exit with a zero status even if nothing matched


回答:


637
git add -u 

すべての変更を更新します


31
魅力的な作品。「git status | sed -n '/ ^#* deleted:/ s /// p' | xargs git rm」のようなものがシンプルで頻繁な要件に対して提案されたソリューションである場合、より良いソリューションは次のとおりです。または間もなく、角を曲がります。
arcseldon 2013年

シンプルな方がいいです。これは「bash」の方法よりも本当に便利です
カスティエル14

1
著者はファイルを削除する方法を尋ねます、なぜファイルを追加することが正しい答えですか?
ケリン

3
@kelin:git docsから(git-scm.com/docs/git-add): "-u --updateすでに<pathspec>に一致するエントリがある場所でインデックスを更新します。これにより、インデックスエントリが削除および変更されます。作業ツリーに一致しますが、新しいファイルは追加されません。-uオプションが使用されたときに<pathspec>が指定されない場合、作業ツリー全体のすべての追跡ファイルが更新されます(古いバージョンのGitは、更新を現在のディレクトリに制限し、そのサブディレクトリ)。」
HEDMON 2016

92

非常に注意してくださいgit rm .。必要以上に削除される可能性があります。もちろん、回復することはできますが、回復する必要がない方が簡単です。

最も簡単なのは:

git rm modules/welcome/language/english/kaimonokago_lang.php \
       modules/welcome/language/french/kaimonokago_lang.php \
       modules/welcome/language/german/kaimonokago_lang.php \
       modules/welcome/language/norwegian/kaimonokago_lang.php

ファイルが存在しないため、シェルワイルドカードは使用できませんが、(少なくともBashでは)使用できます。

git rm modules/welcome/language/{english,french,german,norwegian}/kaimonokago_lang.php

または検討してください:

git status | sed -n '/^# *deleted:/s///p' | xargs git rm

これはの出力を受け取り、git statusデフォルト(sed -n)では何も出力しませんが、で始まる行で# deleted:は、#およびを取り除き、deleted:残っているものを出力します。xargs引数を収集してgit rmコマンドに提供します。これは、名前の類似性(または非類似性)に関係なく、任意の数のファイルで機能します。


6
あなたは、することができます(あなたがそれらをエスケープする必要があるかもしれませんが)ワイルドカードを使用し、それが問題で、彼らはファイルシステム上に存在しないことをしないようにgitのは、だけでなく、それらの作業ツリーで、インデックスのパスと一致します。
ベンジェームス

109
git diff --diff-filter=D --name-only -z | xargs -0 git rmgit statusユーザー指向であり、将来のバージョンでの安定性が保証されていない解析を試みるよりも信頼性の高いアプローチです。
CBベイリー

@Charles:それは確かに優れていますが、どのオプションを使用できるかについてかなりの知識git diffが必要です(以前は必要がなかったので、私は持っていませんでした)。ありがとう!
ジョナサンレフラー、

8
「git ls-files --deleted」もあることに注意してください
Petr Gladkikh

1
だから、git ls-files --deleted | xargs git rm私のためのトリックをしました。
fiacobelli、2015年

50

ByScripts回答の別のバージョンは

git rm $(git ls-files --deleted)

これはgitから削除されたファイルのみを削除します。

変更されたファイルのみを追加するためにも使用できます。

git add $(git ls-files --modified)

これらのコマンドは、Windowsのgitbashでも機能します。


2
貴重な、git ls-filesステータスが削除または変更されたは非常に役立ちます。
マリオペシェフ2014

1
'git add --update (or -u)'ツリーのサブディレクトリからのパス引数なしの動作はGit 2.0で変更されるため、今後は使用しないでください。ツリー全体のコンテンツを追加するには、次を実行します:( git add --update :/ またはgit add -u:/)コマンドを現在のディレクトリに制限するには、次を実行します:( git add --update . またはgit add -u)。現在のGitバージョンでは、コマンドはカレントディレクトリ
アンス

1
スペースを含むパスを処理する方法はありますか?例:src/my spaced directory/myfile。これは個別に処理できますが、この回答のコマンドを使用してどのように処理できますか?
Muhammad Gelbana

35

行ったすべての変更を更新します。

git add -u

削除されたファイルは、ステージングされていない状態(通常は赤色)からステージングされた状態(緑色)に変わります。次に、削除したファイルを削除することをコミットします。

git commit -m "note"

1
ポピュリストバッジに値する。
ジョン

1
これは断然最良の解決策です。スクリプトのハッキングや長いプロセスは必要ありません。gitにインデックスを完全に更新するように伝えるフラグだけです。
Ron Dahlgren、2015

鮮やかさ!20以上のファイルパスを入力する必要がなくなりました。ありがとう!
allardbrain 2017

12

変更されたファイルのステージングを気にしない場合の最良の解決策git add -uは、mshameerspb2qで述べられているように使用することです

削除されたファイルを削除するだけで、変更されたファイルはステージングしない場合は、ls-files引数を--deletedオプションと一緒に使用する必要があります(正規表現やその他の複雑な引数/オプションを使用する必要はありません)。

git ls-files --deleted | xargs git rm

1
git add -Aこの問題を解決します...将来知りたい人のために。以下の回答をチェックしてください
Ja8zyjits

8

はい、git rm <filename>削除されたファイルの状態をステージングします。<filename>グロブパターンが考えられます。

$ git rm modules/welcome/language/*/kaimonokago_lang.php
rm modules/welcome/language/english/kaimonokago_lang.php
rm modules/welcome/language/french/kaimonokago_lang.php
rm modules/welcome/language/german/kaimonokago_lang.php
rm modules/welcome/language/norwegian/kaimonokago_lang.php

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       deleted:    modules/welcome/language/english/kaimonokago_lang.php
#       ...

その後、コミットできます。

git commit -a 必要に応じて、これを一度に行います。

を使用git add -uして、削除されたすべてのファイルを含むすべての変更をステージングし、コミットすることもできます。


そうrm。(完全停止)一度に削除しますか?

だからちょうどgit rmは一度にすべて削除しますか?

1
globスタイルのパターンを使用して、複数のファイルを削除できます。例を示すために回答を更新しました。
ベンジェームス

5
それgit add -uはまさに私たちが探しているもののようです-多くの削除を行い、すべての削除をコミットしたい場合、それは最も簡単で最も「標準的な」方法であるように見えます(つまり、ケース固有のグロブや複雑なシェルの解析なし) xargs)。すべての変更を一度に追加するという事実以外に、これを使用したくない理由はありますか?
trisweb 2012

7

削除したファイルのgit rmうち、コミットのステージングされていないファイルがたくさんある場合は、次のコマンドを使用して、1つのショーにまとめることができます。

for i in `git status | grep deleted | awk '{print $3}'`; do git rm $i; done

質問応答者が述べたように、に注意してくださいgit rm


5

これを試して:

 git rm `git ls-files -d`

これにより、(bashを使用して)削除されたスクリプトのみをステージングするという私の問題が解決しました
MarianoArgañaraz15年

3

使用できます

git commit -m "remove files" -a
git push

手動でファイルを削除した後。


1
または、同一ですがより簡潔です:git commit -am "remove files"
BradChesney79

3

実行時にすべてのファイルを削除するシェルスクリプトを作成できます。

git status | grep deleted | awk '{print "git rm " $3;}' > ../remove.sh

作成されたスクリプトはremove.shgit rmコマンドの完全なリストが含まれています。




2

「git rm」を使用してそれらをすべて削除する場合。これが私がすることです:

git ls-files --deleted -z | xargs -0 git rm

このクエリは、削除されたすべてのファイルのリストを表示し、それらをgitリポジトリから削除します。それが役に立てば幸い。



1

ゴーストファイルを削除し、このきちんとしたコマンドに出会った後、私のリポジトリにゴーストファイルが表示されるという問題が発生しました。

git add -A

これは基本的に同じでgit add -agit add -u組み合わせたものですが、大文字と小文字が区別されます。私はこの素晴らしいリンクからそれを手に入れました(このリンクは今、archive.org上のバージョンを指しています。なぜなら、オリジナルは2016年6月の時点でスパム/フィッシングページに変換されているからです)。


0

削除されたファイルを検出し、次のコミットの一部としてそれらの削除をステージングする方法を次に示します。このスレッドのすべてのソリューションには異なるメリットがあります。以下のこのソリューションは、スペースが含まれているファイル名の問題を具体的に扱っています。

git status --porcelain | awk '/^.D .*$/ {print $0}' | sed 's/.D \(.*\)/\1/' | tr -d '"' | xargs -I {} git rm '{}'

これをgitの--dry-runオプションでテストしてから、次のコマンドで実行してください。

git status --porcelain | awk '/^.D .*$/ {print $0}' | sed 's/.D \(.*\)/\1/' | tr -d '"' | xargs -I {} git rm --dry-run '{}'

説明:

git status --porcelain

これは、パス名にスペースが含まれている場合にのみ発生するD "/ path to a folder / path to a file"のようなものを出力します。

awk '/^.D .*$/ {print $0}'

「D」で始まる行のみに一致

sed 's/ D \(.*\)/\1/'

各文字列の前から「D」を削除する

tr -d '"'

引用符がある場合は削除します

xargs -I {} git rm '{}'

ファイル名変数を{}として定義し、スペースを含むファイル名を確実にサポートするために、単一引用符で囲まれたgit rmの下でファイル名を実行します。

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