web-dev-qa-db-ja.com

git rm複数のファイル?

git rmへのすべてのフルパスを手動で入力せずに、いくつかのファイルを簡単に削除するにはどうすればよいですか?保持したい変更ファイルがたくさんあるので、すべての変更ファイルを削除することもできません。

また、git checkout -- /path/to/file?を手動で入力せずに、いくつかのファイルの変更を元に戻すこともできます。

22
Tower

git rmにワイルドカードを付けることができます。

例えば.

git rm *.c

または、filesToRemove.txtのように、すべてのファイルの名前を別のファイルに書き留めることもできます。

path/to/file.c
path/to/another/file2.c
path/to/some/other/file3.c

これを自動化できます:

find . -name '*.c' > filesToRemove.txt

ファイルを開き、名前を確認します(問題がないことを確認します)。

次に:

cat filesToRemove.txt | xargs git rm

または:

for i in `cat filesToRemove.txt`; do git rm $i; done

その他のオプションについては、マンページでxargsを確認してください(特にファイルが多すぎる場合)。

29
Manish

他の方法(Explorerなど)を使用してそれらを削除してから、git add -Aを実行します。複数のファイルを元に戻すことに関しては、ディレクトリをチェックアウトすることもできます。

9
Ana Betts

POSIXシステムでは、必要なすべてのファイルに一致するシェルグロブを作成できます。これをgit rmおよびgit checkout --に渡すだけです。 Windowsでは、cmd.exeとPowerShellには、アプリケーションへのグロブとファームが含まれていません(gitは、私が読んだものから、ファイルに対してはそれを行いません)。同様の効果を得るには、Windowsコマンドまたはスクリプトを使用してファイルリストを準備し、それをgitコマンドに適切にパイプする必要があります。

ファイルのリストをシェルコマンドに渡すために使用する戦略は、ファイルパスを受け入れるgitコマンドで機能します。

1
jmlane

一度に複数のファイルを削除するには、回答をチェックアウトすることをお勧めします here

不要なファイルを削除して、次のコマンドを実行できます:git rm $(git ls-files --deleted)

1
krngrvr09

Windows 10では、ファイル構造の.gitignoreの場所からGit Bashを使用します。

git rm -r --cached some_directory/

これを使用して、ディレクトリ全体を再帰的に無視しました。これは私の.gitignoreファイルにあるものです:

# Use .gitignore to ignore a directory and its contents #
/some_directory/ 
1
Kirk Powell

あなたは単に使う

find . -name '*.DS_Store' | xargs git rm

多くのファイルを削除するには、ワイルドカードと一致します。

0
Thengocphan

WindowsでUnix/Linux/* BSD機能の多くを提供する Cygwin もチェックアウトできます。 Cygwinには、上記の他のツールの中でも、Bash Shellとfind(1)が含まれています。 (私は通常、Windows 7で一度に2〜4個のCygwin mintty端末を起動します。これは、Cygwinが便利だと思うからです。)

あなたは単に使うことができます:

git add -u
0
Balman Rawat

または、_filesToRemove.txt_のように、すべてのファイルの名前を別のファイルに書き留めることもできます。

「_git rm_」と「_git stash_」は新しい「_--pathspec-from-file_」オプションを学習するため、これはGit 2.26(2020年第2四半期)での優れたアプローチです。

したがって、これ以上_for i in_ cat filesToRemove.txt _; do git rm $i; done_はありません

単純な_git rm --pathspec-from-file=filesToRemove.txt_で十分です。

commit 8a98758commit 8c3713ccommit 3f3d806commit b229091commit 0093abc を参照してください、 commit 2b7460dcommit 5f393dc (2020年2月17日)、および commit 6a7aca6 (2020年1月16日)by Alexandr Miloslavskiy(SyntevoAlex
(合併 濱野純雄--gitster- in commit 9b7f726 、2020年3月9日)

rm :-pathspec-from-fileオプションをサポートします

サインオフ:Alexandr Miloslavskiy

簡単にするために行われた決定:

Argsとfileの両方でpathspecを渡すことは許可されていません。

if (!argc)ブロックの調整が必要でした。

このコードは、実際には「pathspecが存在しない」ことを意味します。
以前は、pathspecはコマンドライン引数からしか取得できなかったため、argcのテストはpathspecの存在をテストする有効な方法でした。しかし、これは_--pathspec-from-file_ではもはや当てはまりません。

_--pathspec-from-file_のストーリー全体を通して、コマンドラインでpathspecを指定するのに非常に近い動作を維持しようとしたので、あるものから別のものに切り替えても驚くことはありません。

ただし、_--pathspec-from-file_が空の場合にユーザーに使用法をスローすることは、「使用法」(つまり、argc/argv配列)には何の問題もないので困惑します。

一方で、古いケースでの投げ方も気になります。パズルではありませんが、私は(ユーザーとして)自分のコマンドラインを「使用法」と比較して違いを見つけようとする経験が好きではありませんでした。エラーが何であるかはすでにわかっているので、その特定のエラーをユーザーに提供するほうがずっと気持ちがいいです。

コミットから判断すると 7612a1ef ( "_git-rm_:honor _-n_ flag" 2006-06-09、git v1.4.0)、この場合の使用法を示しているようには見えません(パッチはsegfaultを回避するためのものでした)が重要であり、他のコマンドが空のpathspecにどのように反応するか(たとえば、カスタムメッセージの_git add_を参照)には適合しません。

したがって、どちらの場合も新しいエラーテキストを表示することにしました。
エラーのテストを早期に継続するために、parse_pathspec()を上に移動しました。現在はread_cache()/hold_locked_index()/setup_work_tree()の前に発生するため、問題は発生しません。

0
VonC

git rmのワイルドカードの扱いが煩わしいことがわかりました。 Findは1行でトリックを実行できます。find . -name '*.c' -exec git rm {} \;{}は、ファイル名が置き換えられる場所です。 findの優れている点は、名前だけでなく、さまざまなファイル属性をフィルタリングできることです。

0
CpILL