すでにディスクから削除されている複数のファイルを Git リポジトリから削除する
-
20-08-2019 - |
質問
Git リポジトリがあり、それを使用して 4 つのファイルを削除しました 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 .
それが可能であればそうします。
解決
のGit 1.1の場合
$ git add -u
以前に削除ファイルを追跡するなど、 - これは自動的に追跡されたファイルをステージングするのgitに指示します。
Gitの2.0
あなたの全体の作業ツリーをステージに:
$ git add -u :/
ただ、現在のパスをステージに:
$ git add -u .
他のヒント
git ls-files --deleted -z | xargs -0 git rm
あなたはそれが私の作品...を探しているかもしれないもの..
あなたが使用することができます。
git add -u
そして、それらをコミットし、ステージング領域に削除されたファイルを追加するには、
git commit -m "Deleted files manually"
あなたは、単に実行する場合:
git add -u
gitのは、あなたが削除したファイルは、実際に次のコミットの一部であるべきことを知っているために、そのインデックスを更新します。そして、あなたはその変更をチェックインするには、「gitのコミット」を実行することができます。
それとも、あなたが実行する場合:
git commit -a
これは、自動的にこれらの変更(および他のもの)を取り、それらをコミットします。
のアップデートの:あなたが唯一の削除されたファイルを追加したい場合は、試してみてください。
git ls-files --deleted -z | xargs -0 git rm
git commit
あなたは、おそらく-Aを探しています:
git add -A
これは、-uを追加gitのに似ていますが、また新しいファイルを追加します。これは、(動き検出、自動あるが)おおよそHGのaddremove
コマンドと同等である。
のみ削除のファイルをステージに
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
便利後で使用するために、することはでき別名にお好みのコマンドセットます。
git rm test.txt
前またはあなたが実際のファイルを削除した後でます。
あなたが望んでいたよりも多くを得ることができます「--all」または「--update」オプションを使用してGitは、追加することもできます。新規および/または変更されたファイルは、インデックスに追加されます。私は他のファイルに触れずにgitから削除されたファイルを削除したいときのために、bashのエイリアスを設定している。
alias grma='git ls-files --deleted -z | xargs -0 git rm'
ファイルシステムから削除されたすべてのファイルが削除されたとして、インデックスに追加されます。
それは本当に重要、私は選んだ答えに反対しないことがます:
git add -u
...作業ツリー内の対応するファイルが削除されている場合は、インデックスからファイルを削除しますが、それはまた、追跡ファイルの変更新しい内容を上演します。
git rm $(git ls-files --deleted)
...一方のみ追跡した削除されたファイルをRMされます。
だから、私の見解では、後者は、より良いオプションです。
これらは変更のみであれば、あなたは、単に行うことができます。
git commit -a
すべての変更をコミットします。それは削除されたファイルが含まれます。
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.
gitの-uを追加します。
-u - 更新 すでにに対する唯一の試合では、インデックスではなく、作業ツリー内のファイルを追跡しました。それはそれは、新しいファイルをステージングしないこと、それが追跡ファイルの変更新しい内容を上演することと作業ツリー内の対応するファイルが削除されている場合、それは、インデックスからファイルを削除することを意味します。
何が、デフォルトに指定されない場合、「」、つまり、すべての現在のディレクトリとそのサブディレクトリ内のファイルを追跡し更新します。
簡単な解決策は、私のために正常に動作しますこと:
git rm $(git ls-files --deleted)
.gitconfig
にそれを追加したい場合は、この操作を行います。
[alias]
rma = !git ls-files --deleted -z | xargs -0 git rm
次に、あなたがしなければならないすべてが実行されます:
git rma
git ls-files --deleted -z | xargs -0 git rm --cached
これはgitのことで、以前の追跡されたすべての削除されたファイルを削除するだけでなく、あなたのファイル名は、それらにスペースを持っているケースを処理します。
あなたのPOSIXのバリアントに応じて、xargs -0 -r
を使用する必要があります。これはヌルコンテンツをパイプする際xargs
が正常に終了するようになります。
EDIT:--cached
と--deleted
フラグが誤ってすでに削除されていないファイルを削除から保護するためにタンデムで使用されている。
それを試してみます。
-a
--all
Tell the command to automatically stage files that have been modified and deleted, but new files you have not told Git about are not affected.
git add . && git commit -m -a "Your commit"
または
git add --all && git commit -m "Your commit"
実際に実行されているコマンドを確認するために-t
を使用してください。
私はちょうど同じことを行うためにヴィレンの答えを微調整します:
git ls-files --deleted -z | xargs -t -0 git rm
git-add のフラグは、削除されたファイルのみをステージングするものではありません。変更したのが削除されたファイルだけであれば問題ありませんが、それ以外の場合は git-status を実行して出力を解析する必要があります。
ジェレミーの答えに基づいて作業すると、これが私が得たものです:
git status | sed -s "s/^.*deleted: //" | grep "\(\#\|commit\)" -v | xargs git rm
- ファイルのステータスを取得します。
- 削除されたファイルの場合は、ファイル名を分離します。
- #s で始まるすべての行と、「deleted」という単語が含まれるステータス行を削除します。それが何だったのか正確には覚えていませんし、もう存在しないので、さまざまな状況に応じてこれを変更する必要があるかもしれません。式のグループ化は GNU 固有の機能である可能性があると思います。そのため、gnutils を使用していない場合は、複数の式を追加する必要があるかもしれません。
grep -v
線。 - ファイルを渡す
git rm
.
これをシェルエイリアスに貼り付けます...
で述べたように
git add -u
削除のために削除されたファイルをステージするだけでなく、更新用ファイルを変更します。
あなたが行うことができます変更されたファイルをunstageするには、
git reset HEAD <path>
。あなたが組織し、きれいに、あなたのコミットを維持したい場合
の の注:のののこれは、これらのワイルドカードを持つので注意削除されたファイルを、またunstageことができます。 の
以下は、あなたがプロセスにたくさんのファイルを持っている場合でも、動作します。
git ls-files --deleted | xargs git rm
あなたは、おそらくまた、コメントでコミットすることをお勧めします。
詳細については、以下を参照してください。便利なGitのスクリプトの
git commit -m 'commit msg' $(git ls-files --deleted)
私はすでにファイルを削除した後、これは私のために働きました。
私は同じことを必要と そして、使用GitのGUIのボタンを「ステージが変更さ」。 それはまた、すべてを追加します。
と
...私は "コミット" 作られた "舞台が変わっ" の後にので、私の作業ディレクトリは再びきれいです。
あなただけ削除されたファイルをステージングするgit add -u <filenames>
を使用することができます。
あなたはファイルのtemplates/*.tpl
を削除した場合、その後、git add -u templates/*.tpl
を使用します。
-u
は、リポジトリ内に存在するが、もはや作業ディレクトリに存在しないファイルを参照するために必要です。それ以外の場合は、git add
のデフォルトは作業ディレクトリ内のファイルを探すことで、あなたがそこに削除したファイルを指定した場合、それはそれらを見つけることができません。
のようなもの。
git status | sed -s "s/^.*deleted: //" | xargs git rm
それを行うことがあります。
ステージングのためのシステムエイリアスを追加すると、
コマンドrm-all
としてファイルを削除しました
UNIX
alias rm-all='git rm $(git ls-files --deleted)'
WINDOWS
doskey rm-all=bash -c "git rm $(git ls-files --deleted)"
注の
はWindowsがbash
がインストールされている必要があります。の
(さらに別の変形例)
私はそのまま他のフォルダを残して、すべて既にディスクファイルからではなく、一つの特定のフォルダから削除削除したいです。以下は私のために働いてます:
git ls-files --deleted | grep <folder-name> | xargs git rm
git rm $(git ls-files -d)
はgit ls-files
コマンド(-dショーのみ削除されたファイル)に記載されているすべてのファイルを削除します。ファイル名またはパスにスペースを含むファイルのために働くのではなく、覚えて簡単な
Visual Studioのプロジェクトのために
'git ls-files --deleted | sed 's/(.*)/"\1"/'| xargs git rm'
削除されたファイルのパスにスペースがある場合に便利です。
私が今までに発見した最も柔軟なソリューションがにある
git cola
そして、私はステージにしたいすべて削除されたファイルを選択します。
(私は通常のgitですべてのコマンドライン操作を行いますが、Gitは少しぎこちない削除されたファイルを処理します)。