S-JIS[2016-01-30] 変更履歴
Gitのrmコマンドのメモ。
ステージングと呼ばれる領域(コミットする対象を保持するもの)に、ファイルの削除を登録するのが「git rm」コマンド。
「git rm」によって、ファイルを削除する。(削除されたことをステージングする)
$ git rm ファイル名1 ファイル名2… $ git rm -r ディレクトリー名
「git rm」に拠らずに削除されたファイル(UNIXのrmコマンドや、エディターの削除機能等で削除したファイル)は、ファイル名の補完が効かないので、指定するのが面倒。
削除されたファイル一覧は「git status」で表示されるので、それをコピーして「git rm」の引数に指定し直せばいいのだが、数が多いと面倒。
「git ls-files --delete」あるいは「git ls-files -d」を使うと(git管理下から)削除されたファイル一覧を表示することが出来るので、それを「git rm」の引数に指定すれば楽。
$ git rm $(git ls-files --deleted)
参考: あっきぃさんの『削除したファイルをコミットする Git』
過去に削除したファイルの内容を参照するには、「git cat-file」あるいは「git show」を使う。
「git cat-file」や「git show」に、削除したファイルのパスとリビジョン(コミットのハッシュ値)を指定すればファイルの内容を見ることが出来る。
「git show」はUNIXのlessコマンドでファイルを表示する。
「git cat-file」はファイルの内容を標準出力に出力するので、リダイレクトでファイルに保存することが出来る。
なのだが、ファイル名はまだしもパスを正確に覚えているとは限らないし、リビジョンに至っては知っている方が不自然(爆)
なので、まずはそれらを調べる必要が有る。
「git log
--stat」で、リビジョン(コミットのハッシュ値)とそのコミットで変更(追加・削除)されたファイルの一覧が表示されるので、そこから該当ファイルを(目grepで)探す。
コミット数が多いと、探すのは大変だけど(苦笑)
$ git log --stat 〜 commit e6c75c8002b65882bf52b519ebf75d3f89bf7cbf Author: hishidama <hishidama@mailaddress> Date: Sat Jan 30 20:20:50 2016 +0900 Remove dir dir/test.txt | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) 〜
これでファイルを削除した時のコミットのハッシュ値とファイルのパスが分かるので、それを使ってファイルの内容を表示する。
$ git cat-file -p e6c75c8002b65882bf52b519ebf75d3f89bf7cbf^:dir/test.txt あるいは $ git show e6c75c8002b65882bf52b519ebf75d3f89bf7cbf^:dir/test.txt
表示したいリビジョンとパスをコロン「:
」で区切って指定する。
リビジョンの末尾に「^
」が付いているのは、ひとつ前のリビジョンを意味している。つまりファイルが削除される前のリビジョンを指定していることになる。
表示したいのは、削除前の内容なので。
「git log --name-status」で、ファイルのパスと変更の種類(追加ならA、変更ならM、削除ならDが先頭に付いた状態)が表示される。
(grepに指定した「^D」は正規表現で、「先頭の文字列がD」という意味)
$ git log --name-status | grep ^D | grep test.txt
D dir/test.txt
これで、ファイルのパスを確認することが出来た。
次に、コミットのハッシュ値を探す。
$ git rev-list -n 1 HEAD -- dir/test.txt e6c75c8002b65882bf52b519ebf75d3f89bf7cbf
「git rev-list HEAD -- パス」で、そのファイルが今まで変更された全てのコミットのハッシュ値が表示される。「-n 1」を付けると、先頭ひとつだけ、つまり一番最新のハッシュ値が取れる。
今回は削除されたファイルを指定したので、最新のコミットとは、削除した時のコミットということになる。
これでファイルを削除した時のコミットのハッシュ値とファイルのパスが分かったので、ファイルの内容を表示できる。
$ git cat-file -p e6c75c8002b65882bf52b519ebf75d3f89bf7cbf^:dir/test.txt あるいは $ git show e6c75c8002b65882bf52b519ebf75d3f89bf7cbf^:dir/test.txt