すでにディスクから削除されているGitリポジトリから複数のファイルを削除する


1311

私が使用してからの4つのファイルを削除したことをGitのレポ持ってrmない git rm)、このような私のGitのステータスルックスを:

#    deleted:    file1.txt
#    deleted:    file2.txt
#    deleted:    file3.txt
#    deleted:    file4.txt

これらのファイルをGitから削除するには、次のように手動で調べて各ファイルを追加する必要はありません。

git rm file1 file2 file3 file4

git add .できれば、同じように機能するものが理想です。



10
@seth、それを使用git rmすることが常に便利であるとは限りません。削除は、別のツール、IDEまたはファイルマネージャーから行われた可能性があります。Visual Studioの1つは、ファイルを削除または名前変更するときに面倒な場合があります。
ブレット・ライアン

67
なぜ、なぜ使用しないのgit rmかを尋ねるのは、なぜgit vimやを使用しないのかを尋ねるようなものgit cdです。これは愚かなことです。削除されたファイルをステージングから削除するには、gitに組み込みコマンドまたはエイリアスが必要です。SOで検索したり、昼休みのmanページを読んだりする必要はありません。
WCWedin 2013

7
Varinderの答えは良い方法ではありません。Codyが提案したgit add -uを検討してください。これは、この質問への回答でもあります。stackoverflow.com
Roland

回答:


2300

Git 1.xの場合

$ git add -u

これは、以前に追跡されたファイルの削除を含め、追跡されたファイルを自動的にステージングするようにgitに指示します。

Git 2.0の場合

作業ツリー全体をステージングするには:

$ git add -u :/

現在のパスのみをステージングするには:

$ git add -u .

133
これにより変更および追跡されたすべてのファイルが追加され、削除および更新されます。
イアンハンター

19
@beanlandでは、すべてを取得したくない場合は、変更する特定のファイルへのパスを指定するだけで済みます。例:git add -u [パス]
Paul Prewett

27
またgit add -u folder/、この操作をフォルダで実行するには
c ..

2
参考

1
これは、このページに到達したときに人々が尋ねていた質問である可能性があり、OPが実際に尋ねることが意図したものである可能性がありますが、尋ねられた正確な質問には答えません。
Relequestual

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

あなたが探しているものかもしれません。


5
Windowsの場合は、Evan Moranによって上記のように引用符なしで構成に次のエイリアスを追加しようとします 'remove =!git ls-files --deleted -z | xargs -0 git rm '
CLS

21
名前にスペースが含まれているファイルに注意してください
maazza

44
@DaveEverittgit ls-files --deleted -z | xargs -0 git rm
Max

15
Codyが提案するgit add -uは、はるかに単純で安全な方法であり、誤ってファイルを削除するリスクがありません。
Roland、

4
一部のファイルで機能する場合でも、これは間違った回答であるため、これに反対票を投じます。以下の「git add -u」を使用してください。それが目的です。
n13

733

使用できます

git add -u

削除したファイルをステージング領域に追加して、コミットするには

git commit -m "Deleted files manually"

101
Googleユーザーに注意してください:変更された追跡ファイルもステージング領域に追加されます。
エレノン

4
このコマンドは、ファイルを削除したばかりで、すぐにステージングする場合にのみ実行してください。
Aryo

1
bitbucketリポジトリからファイルを削除できません]
srinivas gowda

356

単に実行すると:

git add -u

gitはインデックスを更新して、削除したファイルが実際には次のコミットの一部であることを認識します。次に、「git commit」を実行して、その変更をチェックインできます。

または、実行した場合:

git commit -a

これらの変更(およびその他の変更)を自動的に取得してコミットします。

更新:削除されたファイルのみを追加したい場合は、以下を試してください。

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

1
右、git commit -a私がしたいことをしますが、場合によってはコミットしたくないファイルがあるので、手動でコミットを準備したいです。
Igor Zevaka

2
commit -aは基本的に最初に「add -u」を実行します。既知のファイルへの変更(削除または単純な変更)でインデックスを更新します。もちろん、もっと具体的にして、必要なファイルだけを追加/ rmすることもできます。git.or.cz/gitwiki/…役立つ場合があります。
Emil Sit

2
「Update:..」の下のコマンドセットは、魅力のように機能しました。ありがとう!
ジェイテイラー

10
'git ls-files --deleted |ありがとう xargs git rm '!
2012年

18
「git ls-files --deleted | xargs git rm」が正解です。ありがとう!
2013年

166

あなたはおそらく-Aを探しています:

git add -A

これはgit add -uに似ていますが、新しいファイルも追加します。これは、hgのaddremoveコマンドとほぼ同じです(ただし、移動の検出は自動的に行われます)。


8
簡単に言うと、-uを使用すると、追跡対象ファイルへの追加が制限され、-aを使用すると、追跡されていないファイルも含まれます。違いを指摘しようと思いました。
spaaarky21 2012年

この段階で、commit -aフラグを使用してすべてを追加することもできます。
ザック

94

削除されたファイルのみをステージングするには:

for x in $(git status | grep deleted | awk '{print $2}'); do git rm $x; done

または(xargsの方法):

git status | awk '/deleted/ {print $2}' | xargs git rm

後で使用できるように、好みのコマンドセットにエイリアスを設定できます。


2
@Saebキューについて理解していますが、xargs習得するには約15分です。
エリックウィルソン

11
git status | awk '/deleted/ {print $3}' | xargs git rmそれを行うためのより短い方法でしょう。 grep | awk...ただ言ってください
マークリード

58
git rm $(git ls-files --deleted)これはもっと便利ではありません(thisからコピーされます)。
Hotschke 2013年

1
xargsまたは上記の$()置換(リストが巨大でないことがわかっている場合)。リスト膨大な場合: git ls-files --deleted | while read f; do git rm $f; done
Andrew

2
@Andrew xargsは、実行するたびに複数の引数を渡すため、巨大なリストのwhileループよりもおそらく効率的ですgit rm。渡される引数の数を制限するにはgit rm、それが実行されるたびに、使用-nオプションを:git ls-files --deleted | xargs -n 15 git rm
Ajedi32

61
git rm test.txt

実際のファイルを削除する前または後。


7
それがうまくいく間、私はしばしば自分で大量のファイルを削除し、rm後でそれを後悔することに気づきます。
カール

4
なぜこれよりも悪いのgit add -uですか?すべての変更を追加するよりも、削除された特定のファイルをコミットに追加する方が安全なようです。
Ian Dunn

2
質問の最後の行「ディスクからも削除されているgitからすべてのファイルを削除するコマンドが欲しいだけです」によると、これが実際に最良の答えになるはずです。
Ramsharan 2013年

2
@Ramsharanいいえ、それはまったく行いません。これにより、単一のファイルが削除されます。OPは、「すべて」の削除されたファイルを特別に要求しました。
アダム

1
@Ramsharanいいえ、それがポイントです。ほとんどすべての場合、単純にワイルドカードを使用することはできません(一致するワイルドカードはありません)。これが主な答えが非常に複雑である理由です。
アダム

49

'--all'または '--update'オプションを指定してgit-addを使用すると、必要以上の結果が得られる場合があります。新しいファイルや変更されたファイルもインデックスに追加されます。他のファイルに触れずにgitから削除されたファイルを削除したい場合のためにbashエイリアスを設定しています:

alias grma='git ls-files --deleted -z | xargs -0 git rm'

ファイルシステムから削除されたすべてのファイルは、削除されるとインデックスに追加されます。


39

それが本当に重要であるというわけではありませんが、私は選択した答えに同意しません:

git add -u 

...作業ツリー内の対応するファイルが削除されている場合、インデックスからファイルを削除しますが、追跡されたファイルの変更された新しいコンテンツもステージングします。

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

...一方、追跡された削除済みファイルのみがrmされます。

したがって、私の見解では後者がより良いオプションです。


29

それらが唯一の変更である場合、あなたは単に行うことができます

git commit -a

すべての変更をコミットします。削除されたファイルが含まれます。


3
なぜ私が反対票を投じたのかわからない。git rmを使用して明示的に指定していなくても、gitは削除されたファイルを識別するのに適しています。
SpoonMeiser 2009

「-a」は許容できるスイッチではないため、「-A」です。回答を編集しています。
2013

10
いいえ、コマンドはcommitであるため、「-a」許容されるスイッチです。「-A」は追加するコミットしないスイッチです。提案された編集は既に拒否されています。
SpoonMeiser 2013

コミットしているのが削除されたファイルだけの場合は、スイッチ--allow-empty
billrichardsを

あなたはgitのRM --cachedなかった場合errは、実際に--allow-空にのみ必要とされている
billrichards

20
git ls-files --deleted | xargs git rm 

削除されたファイルのみを追加するのに最適なオプションです。

ここにいくつかの他のオプションがあります。

git add .  => Add all (tracked and modified)/new files in the working tree.

git add -u => Add all modified/removed files which are tracked.

git add -A => Add all (tracked and modified)/(tracked and removed)/new files in the working tree.

git commit -a -m "commit message" - Add and commit modified/removed files which are tracked.

16

git add -u

-u --update作業ツリーではなく、インデックスですでに追跡されているファイルとのみ一致します。つまり、新しいファイルはステージングされませんが、追跡されたファイルの変更された新しいコンテンツはステージングされ、作業ツリー内の対応するファイルが削除されている場合は、インデックスからファイルが削除されます。

何も指定されていない場合、デフォルトは "。"です。つまり、現在のディレクトリとそのサブディレクトリにあるすべての追跡ファイルを更新します。


トップ投票の答えはすでに使用するように言っていますgit add -u。あなたの答えの他のすべてのものはどこから来ていますか、ドキュメント?ドキュメントにリンクし、リンクしている場合はブロッククォートする必要があります。
TheWarriorNamedFoo 2014

14

その簡単な解決策は私にとってはうまくいきます:

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

現在の作業ディレクトリでは常にgit shellを使用する必要があると思います
Houssem Badri

2
これは素晴らしくシンプルですが、再帰的なフォルダでは機能しません。
DrB 2015

@BehnazChangiziそうだと思います、stackoverflow.com
questions / 1054044 /…

パス内の@PvdLが受け入れられないスペースはos固有の問題です
Houssem Badri

11

あなたがそれにそれを追加したいなら、これをしてください.gitconfig

[alias]
  rma = !git ls-files --deleted -z | xargs -0 git rm

それからあなたがしなければならないすべては走ることです:

git rma

1
およびcmd行からgit config --global alias.rmd '!git ls-files --deleted -z | xargs -0 git rm'
Casey

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

これにより、以前にgitによって追跡されたすべての削除済みファイルが削除され、ファイル名にスペースが含まれている場合も処理されます。

POSIXバリアントによっては、次を使用する必要がある場合がありますxargs -0 -r。これによりxargs、パイプされたnullコンテンツを正常に終了します。

編集:--cached--deletedフラグは、削除されていないファイルを誤って削除しないように、タンデムで使用されます。


7

変更および削除されたファイルを自動的にステージングするようにコマンドに指示しますが、Gitに通知していない新しいファイルは影響を受けません。

-a
--all

git add . && git commit -m -a "Your commit"

または

git add --all && git commit -m "Your commit"

1
git add --all && git commit -m "Your commit"これは、Git bashコマンドシェルを使用して、windows-7で動作しました。
kmarabet 2015年

1
次のコマンドは、Windows 7でGit bashコマンドシェルを使用して機能しました。$ git add --all && git commit -m "remove property files" [master 58c41ac] remove property files 1 file changed、9 deletes(-)。 ..次に、コミットされた変更をリモートリポジトリにプッシュするには、次のコマンドを実行します:$ git push origin ..オブジェクトのカウント:10、完了。
kmarabet 2015年

6

処理するファイルがたくさんある場合でも、以下は機能します。

git ls-files --deleted | xargs git rm

コメントを付けてコミットすることもできます。

詳細については、有用なGitスクリプトを参照してください。


6

-t実際に実行されているコマンドを確認するために使用してください

私は同じことをするためにVirenderの答えを調整しました:

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

5

git-addのフラグは、削除されたファイルのみをステージングしません。変更したものがすべて削除されたファイルである場合は問題ありませんが、それ以外の場合はgit-statusを実行して出力を解析する必要があります。

ジェレミーの答えに基づいて、これは私が得たものです:

git status |  sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm
  1. ファイルのステータスを取得します。
  2. 削除されたファイルの場合は、ファイルの名前を分離します。
  3. #sで始まるすべての行と、「deleted」という単語が含まれているステータス行を削除します。私はそれが何であったか、正確には覚えていません、そしてそれはもはやそこにないので、あなたは異なる状況のためにこれを修正しなければならないかもしれません。式のグループ化はGNU固有の機能かもしれないと思うので、gnutilsを使用していない場合は、複数grep -v行を追加する必要があるかもしれません。
  4. ファイルをに渡しますgit rm

これをシェルエイリアスに貼り付けます...


5

述べたように

git add -u

削除されたファイルを削除のためにステージングしますが、更新のためにファイルを変更します。

変更したファイルをステージング解除するには

git reset HEAD <path>

コミットを整理してクリーンに保ちたい場合。
注:これにより、削除されたファイルのステージが解除されることもあるため、これらのワイルドカードに注意してください。


4
git commit -m 'commit msg' $(git ls-files --deleted)

これは、ファイルを既に削除した後で機能しました。


3

同じものが必要で、git guiの「stage changed」ボタンを使用しました。それもすべて追加します。

そして、「ステージが変わった」後、「コミット」しました...

だから私の作業ディレクトリは再びきれいです。


guiを使うのはごまかしですlol!しかし、GUIデザイナーがあなたのニーズをカバーする場合には、より速くなります。「ボンネットの下にあるもの」をいじくる方法を知るのは良いことです。
Dennis

1
参考

3
git rm $(git ls-files -d)

git ls-filesコマンドによってリストされたすべてのファイルを削除します(-dは削除されたファイルのみを表示します)。ファイル名またはパスにスペースが含まれているファイルでは機能しませんが、覚えやすい


2

を使用git add -u <filenames>して、削除されたファイルのみをステージングできます。

たとえば、ファイルを削除した場合はtemplates/*.tpl、を使用しますgit add -u templates/*.tpl

-uリポジトリに存在しないが、作業ディレクトリに存在しなくなったファイルを参照するために必要とされます。それ以外の場合、デフォルトのgit addは、作業ディレクトリでファイルが検索され、そこで削除したファイルを指定した場合、それらは見つかりません。


2

コマンドとして削除されたファイルをステージングするためのシステムエイリアスの追加 rm-all

UNIX alias rm-all='git rm $(git ls-files --deleted)'

ウィンドウズ doskey rm-all=bash -c "git rm $(git ls-files --deleted)"

注意

Windowsがbashインストールされている必要があります。


2

(さらに別のバリエーション)

ディスクファイルから既に削除されたすべてのファイルを削除したいのですが、他のフォルダはそのままにして、特定のフォルダから削除しました。以下は私のために働きました:

git ls-files --deleted  | grep <folder-name> | xargs git rm

1

何かのようなもの

git status | sed -s "s/^.*deleted: //" | xargs git rm 

それを行うかもしれません。


2019 gitバージョン2.13.3:git diff --diff-filter=D --name-only | xargs git rm
user151841

1

ビジュアルスタジオプロジェクトの場合

'git ls-files --deleted | sed 's/(.*)/"\1"/'| xargs git rm' 

削除されたファイルパスにスペースがある場合に便利です


-1

私がこれまでに見つけた最も柔軟なソリューションは

git cola

そして、ステージングしたいすべての削除済みファイルを選択します。

(私は通常、すべてのコマンドラインをgitで実行しますが、gitは削除されたファイルを少し厄介に処理します)。


ワイルドカードは私にとってはうまくいかなかったgit add -u path/to/my/deleted-files-pattern-*.ymlので、これは私にとって最良の答えでした(削除されたすべてのファイルをステージングするのではなく、数百のうち50)。
mlncn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.