経緯
少し前にローカルのリポジトリを整理したくなった。
Bitbucket や GitHub に複製があれば良いので、しばらく使っていない不要なローカルリポジトリは消してしまおうかな。
でも「全ての必要なファイルは復旧できること」「消してしまうファイルは不要なものだけであること」はちゃんと確認したいな。
という感じ。自分で確認した事項と、実施した手順を書いておく。
確認した事項
- ローカルの最後のコミットからファイルの変更がない
- ローカルのコミットが全てリモートに存在している
- "Git が無視しているファイル" は全て消してよいか
意外と 3. を忘れがち。
例えばディレクトリごと無視している logs
に大事なファイルが紛れ込んでいるケースがある。
うっかりまるごと消すとどこにも複製がなく、取り返しがつかない。
手順(コマンド)
というわけで、 1. 2. 3. のコマンドを以下に書き留めておく。
1. ローカルの最後のコミットからファイルの変更がない
$ git status --porcelain
$
何も表示されなければ OK
2. ローカルのコミットが全て origin に存在している
$ git log --branches --not --remotes=origin
$
これも何も表示されなければ OK
branches というオプション名だけれど、実際は commit 毎の単位を指しているようだ(?)。
なおこの not での否定は複数にできる。
もし複数のリモートリポジトリがあるとして、例えば origin と origin2 のどちらかに存在していれば構わないときは、
$ git log --branches --not --remotes=origin --remotes=origin2
$
とすればいい。
3. "Git が無視しているファイル" は全て消してよいか
さてこれが問題。
git check-ignore
すれば、そのファイルが無視されているか調べることができるらしい。
なので find コマンドで全てのファイルを列挙し、 xargs で渡すことにした。
実行例:
$ find . -type f -print | xargs git check-ignore
./.DS_Store
./.python-version
./bin/.DS_Store
./bin/__pycache__/main.py
これらは目視で確認した。
よし、このリポジトリは消しても大丈夫そうだ。
参考
http://git-scm.com/docs/git-log
http://qiita.com/marutanm/items/1401e15e249e8f48b645
http://stackoverflow.com/questions/2657935/checking-for-a-dirty-index-or-untracked-files-with-git
http://stackoverflow.com/questions/466764/show-ignored-files-in-git
免責
「この内容の通り確認した後 rm -rf
したら△△と○○が消えてしまった!」ということがあっても、筆者は何も保証しません。
余談
それでも怖い時は tar で固めて暗号化して Amazon S3 に置くという手がある。