日本語 ▾ トピック ▾ 最新バージョン ▾ git-rm は 2.50.0 で最終更新されました

名前

git-rm - 作業ツリーとインデックスからファイルを削除する

概要

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch]
       [--quiet] [--pathspec-from-file=<file> [--pathspec-file-nul]]
       [--] [<pathspec>…​]

説明

pathspec に一致するファイルをインデックスから、または作業ツリーとインデックスから削除します。git rm は作業ディレクトリからのみファイルを削除しません。(ファイルを作業ツリーからのみ削除し、インデックスには残すオプションはありません。その場合は/bin/rmを使用してください。) 削除されるファイルはブランチの先端と同一である必要があり、内容の更新がインデックスにステージングされていない必要がありますが、このデフォルトの動作は-fオプションでオーバーライドできます。--cachedが指定された場合、ステージングされた内容はブランチの先端またはディスク上のファイルのいずれかと一致する必要があり、ファイルがインデックスからのみ削除されることを許可します。スパースチェックアウトが使用されている場合 (git-sparse-checkout[1]を参照)、git rm はスパースチェックアウトパターン内のパスのみを削除します。

オプション

<pathspec>...

削除するファイル。先行するディレクトリ名 (例: dir を指定して dir/file1dir/file2 を削除) を指定すると、ディレクトリ内のすべてのファイルとそのサブディレクトリすべてを再帰的に削除できますが、これには-rオプションを明示的に指定する必要があります。

このコマンドは、Git に認識されているパスのみを削除します。

ファイルグロビングはディレクトリ境界をまたいで一致します。したがって、2つのディレクトリdd2がある場合、git rm d*'git rm d/*'の使用には違いがあります。前者はディレクトリd2全体も削除するからです。

詳細については、gitglossary[7]<pathspec>エントリを参照してください。

-f
--force

最新の状態チェックをオーバーライドします。

-n
--dry-run

実際にファイルを削除しません。代わりに、それらがインデックスに存在し、そうでなければコマンドによって削除されるかどうかのみを表示します。

-r

先頭のディレクトリ名が指定された場合に、再帰的な削除を許可します。

--

このオプションは、コマンドラインオプションとファイルリストを分離するために使用できます(ファイル名がコマンドラインオプションと間違われる可能性がある場合に便利です)。

--cached

このオプションを使用すると、インデックスからのみパスをアンステージして削除します。作業ツリーのファイルは、変更されているかどうかにかかわらず、そのまま残されます。

--ignore-unmatch

ファイルが一致しなくても、ステータスゼロで終了します。

--sparse

スパースチェックアウトコーンの外部にあるインデックスエントリの更新を許可します。通常、git rm は、パスがスパースチェックアウトコーン内に収まらないインデックスエントリの更新を拒否します。詳細については、git-sparse-checkout[1]を参照してください。

-q
--quiet

git rm は通常、削除されたファイルごとに1行 (rm コマンドの形式) を出力します。このオプションは、その出力を抑制します。

--pathspec-from-file=<file>

パススペックは引数ではなく<file>で渡されます。<file>が正確に-の場合は標準入力が使用されます。パススペック要素はLFまたはCR/LFで区切られます。パススペック要素は設定変数core.quotePathで説明されているように引用符で囲むことができます(git-config[1]を参照)。--pathspec-file-nulとグローバルな--literal-pathspecsも参照してください。

--pathspec-file-nul

--pathspec-from-fileとの組み合わせでのみ意味があります。パススペック要素はNUL文字で区切られ、他のすべての文字はリテラルとして扱われます (改行や引用符を含む)。

ファイルシステムから消失したファイルを削除する

git rm には、ファイルシステムから消失したパスのみをインデックスから削除するオプションはありません。しかし、ユースケースによっては、いくつかの方法でそれを行うことができます。

「git commit -a」を使用する

次のコミットで、作業ツリー内の追跡対象ファイルのすべての変更を記録し、作業ツリーからrm (つまりgit rmとは対照的に) で削除されたファイルのすべての削除を記録するつもりである場合、git commit -a を使用してください。これは、すべての削除を自動的に認識し記録します。また、git add -u を使用してコミットせずに同様の効果を得ることもできます。

「git add -A」を使用する

ベンダーブランチの新しいコードドロップを受け入れる際、パスの削除、新しいパスの追加、既存のパスの変更の両方を記録したいと考えるでしょう。

通常、まず次のコマンドを使用して作業ツリーからすべての追跡対象ファイルを削除します。

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

そして、新しいコードを作業ツリーにアンタールします。または、変更を作業ツリーに rsync することもできます。

その後、作業ツリー内のすべての削除、追加、変更を記録する最も簡単な方法は次のとおりです。

git add -A

git-add[1]を参照してください。

その他の方法

本当にやりたいことが、作業ツリーに存在しなくなったファイルをインデックスから削除することだけである場合 (おそらく作業ツリーがダーティであるため、git commit -a を使用できない場合など)、次のコマンドを使用します。

git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached

サブモジュール

gitfile を使用するサブモジュール (Git バージョン 1.7.8 以降でクローンされたことを意味します) のみが作業ツリーから削除されます。これは、そのリポジトリがスーパープロジェクトの .git ディレクトリ内に存在するためです。サブモジュール (またはその中にネストされたもの) がまだ .git ディレクトリを使用している場合、git rm はサブモジュールの git ディレクトリをスーパープロジェクトの git ディレクトリに移動して、サブモジュールの履歴を保護します。存在する場合、gitmodules[5]ファイル内の submodule.<name> セクションも削除され、そのファイルはステージングされます (ただし、--cached または -n が使用されていない場合)。

サブモジュールは、HEADがインデックスに記録されているものと同じであり、追跡対象ファイルが変更されておらず、無視されない追跡対象外ファイルがサブモジュールの作業ツリーに存在しない場合に最新であると見なされます。無視されたファイルは消耗品と見なされ、サブモジュールの作業ツリーの削除を停止させることはありません。

コミットせずに作業ツリーからサブモジュールのローカルチェックアウトのみを削除したい場合は、代わりにgit-submodule[1] deinitを使用してください。サブモジュールの削除の詳細については、gitsubmodules[7]も参照してください。

git rm Documentation/\*.txt

Documentation ディレクトリとそのサブディレクトリにあるすべての *.txt ファイルをインデックスから削除します。

この例では、アスタリスク*がシェルから引用されていることに注意してください。これにより、シェルではなくGitがDocumentation/ディレクトリ内のファイルとサブディレクトリのパス名を展開します。

git rm -f git-*.sh

この例ではシェルがアスタリスクを展開するため (つまり、ファイルを明示的にリストアップしているため)、subdir/git-foo.sh は削除されません。

バグ

スーパープロジェクトの更新によって、データが格納されたサブモジュールが削除されるたびに(例えば、削除前と削除後のコミットを切り替えるときなど)、古い場所に陳腐化したサブモジュールのチェックアウトが残ります。古いディレクトリの削除は、gitfileを使用している場合にのみ安全です。そうしないと、サブモジュールの履歴も削除されてしまいます。このステップは、再帰的なサブモジュール更新が実装されたときに廃止されます。

関連項目

GIT

git[1]スイートの一部

scroll-to-top