git rm
へのすべてのフルパスを手動で入力せずに、いくつかのファイルを簡単に削除するにはどうすればよいですか?保持したい変更ファイルがたくさんあるので、すべての変更ファイルを削除することもできません。
また、git checkout -- /path/to/file
?を手動で入力せずに、いくつかのファイルの変更を元に戻すこともできます。
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
を確認してください(特にファイルが多すぎる場合)。
他の方法(Explorerなど)を使用してそれらを削除してから、git add -A
を実行します。複数のファイルを元に戻すことに関しては、ディレクトリをチェックアウトすることもできます。
POSIXシステムでは、必要なすべてのファイルに一致するシェルグロブを作成できます。これをgit rm
およびgit checkout --
に渡すだけです。 Windowsでは、cmd.exeとPowerShellには、アプリケーションへのグロブとファームが含まれていません(gitは、私が読んだものから、ファイルに対してはそれを行いません)。同様の効果を得るには、Windowsコマンドまたはスクリプトを使用してファイルリストを準備し、それをgitコマンドに適切にパイプする必要があります。
ファイルのリストをシェルコマンドに渡すために使用する戦略は、ファイルパスを受け入れるgitコマンドで機能します。
一度に複数のファイルを削除するには、回答をチェックアウトすることをお勧めします here
不要なファイルを削除して、次のコマンドを実行できます:git rm $(git ls-files --deleted)
Windows 10では、ファイル構造の.gitignore
の場所からGit Bashを使用します。
git rm -r --cached some_directory/
これを使用して、ディレクトリ全体を再帰的に無視しました。これは私の.gitignore
ファイルにあるものです:
# Use .gitignore to ignore a directory and its contents #
/some_directory/
あなたは単に使う
find . -name '*.DS_Store' | xargs git rm
多くのファイルを削除するには、ワイルドカードと一致します。
WindowsでUnix/Linux/* BSD機能の多くを提供する Cygwin もチェックアウトできます。 Cygwinには、上記の他のツールの中でも、Bash Shellとfind(1)が含まれています。 (私は通常、Windows 7で一度に2〜4個のCygwin mintty端末を起動します。これは、Cygwinが便利だと思うからです。)
あなたは単に使うことができます:
git add -u
または、_
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 8a98758 、 commit 8c3713c 、 commit 3f3d806 、 commit b229091 、 commit 0093abc を参照してください、 commit 2b7460d 、 commit 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()
の前に発生するため、問題は発生しません。
git rm
のワイルドカードの扱いが煩わしいことがわかりました。 Findは1行でトリックを実行できます。find . -name '*.c' -exec git rm {} \;
{}
は、ファイル名が置き換えられる場所です。 find
の優れている点は、名前だけでなく、さまざまなファイル属性をフィルタリングできることです。