コマンド名
「git-rm」:ワークツリーとインデックスからファイルを削除
概要
git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--pathspec-from-file=<file> [--pathspec-file-nul]] [--] [<pathspec>…]
説明
パススペックに一致するファイルをインデックスから、またはワークツリーとインデックスから削除します。git rm
ワークディレクトリだけからファイルを削除することはありません(ワークツリーからのみファイルを削除し、それをインデックスに保持するオプションはありません。必要に応じて/bin/rm
を使用してください)。削除するファイルはブランチの末端と同じである必要があります。またコンテンツの更新をインデックスにステージングすることはできませんが、そのデフォルトのオペレーションは-f
オプションで上書きできます。--cached
を指定すると、ステージングされたコンテンツはブランチの末端またはディスク上のファイルのいずれかに一致している必要があり、ファイルをインデックスのみから削除できるようになります。
オプション
<pathspec>…
削除するファイル。先頭のディレクトリ名(例えば、dir/file1
およびdir/file2
を削除するdir
)を指定して、ディレクトリ内のすべてのファイル、および再帰的にすべてのサブディレクトリを削除できますが、これには-r
オプションを明示的に指定する必要があります。
このコマンドはGitが認識しているパスのみを削除します。
ファイルグロブはディレクトリの境界を越えて一致します。したがって、2つのディレクトリd
とd2
が与えられた場合、前者はディレクトリd2もすべて削除するため、git rm 'd*'
およびgit rm 'd/*'
の使用には違いがあります。
詳細についてはgitglossary[7]のパススペックのエントリを参照してください。
-f
--force
--force
最新のチェックを上書きします。
-n
--dry-run
--dry-run
実際にファイルを削除しません。その代わりにそれらがインデックスに存在するかどうかを表示し、そうでない場合はコマンドによって削除します。
-r
先頭のディレクトリ名が指定されている場合、再帰的な削除を許可します。
--
このオプションはコマンドラインオプションをファイルのリストから分離するために使用できます(ファイル名がコマンドラインオプションと間違えられる可能性がある場合に便利です)。
--cached
このオプションを使用し、パスをステージング解除し、インデックスからのみ削除します。ワークツリーファイルは変更されているかどうかに関係なく、そのままになります。
--ignore-unmatch
一致するファイルがない場合、ステータスがゼロで終了します。
-q
--quiet
--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」を使用
次のコミットで追跡されたファイルのすべての変更をワークツリーに記録し、ワークツリーから削除されたファイルのすべての削除を(git rm
ではなく)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
サブモジュール
リポジトリはスーパープロジェクトの.gitディレクトリ内にあるため、gitfileを使用するサブモジュール(つまり、Gitバージョン1.7.8以降でクローンされたもの)のみがワークツリーから削除されます。サブモジュール(またはその中にネストされているものの1つ)がまだ.gitディレクトリを使用している場合、git rm
はサブモジュールの履歴を保護するためにサブモジュールのgitディレクトリをスーパープロジェクトのgitディレクトリに移動します。サブモジュールが存在する場合、gitmodules[5]ファイルの「name」セクションも削除され、そのファイルがステージングされます(–cachedまたは-nが使用されている場合を除きます)。
ヘッドがインデックスに記録されているものと同じであり、追跡されたファイルが変更されておらず、無視されておらず追跡されていないファイルがサブモジュールのワークツリーに存在しない場合、サブモジュールは最新であると見なされます。無視されたファイルは消耗品と見なされ、サブモジュールのワークツリーの削除を停止しません。
削除をコミットせずにサブモジュールのローカルチェックアウトのみをワークツリーから削除する場合、代わりにgit-submodule[1] deinit
を使用してください。サブモジュールの削除の詳細についてはgitsubmodules[7] も参照してください。
例
git rm Documentation/\*.txt
git rm Documentation/\*.txt
Documentationディレクトリとそのサブディレクトリの下にあるすべての*.txt
ファイルをインデックスから削除します。
この例ではアスタリスク*
がシェルから引用されていることに注意してください。これにより、シェルではなくGitがDocumentation/
ディレクトリの下のファイルとサブディレクトリのパス名を展開できるようになります。
git rm -f git-*.sh
git rm -f git-*.sh
この例ではシェルがアスタリスクを展開できるため(つまりファイルを明示的にリストしている)、subdir/git-foo.sh
は削除されません。
バグ
スーパープロジェクトの更新により、入力されたサブモジュールが削除される毎に(例えば、削除の前後でコミットを切り替える場合)、古いサブモジュールのチェックアウトは古い場所に残ります。古いディレクトリの削除はgitfileを使用している場合にのみ安全です。そうしないとサブモジュールの履歴も削除されます。この手順はサブモジュールの再帰的な更新が実装されている場合は廃止されます。
参照
git-add[1]
GIT
git[1]パッケージソフトの一部