LoginSignup
4
5

More than 5 years have passed since last update.

git、存在してほしくない記述をなかったことにする

Last updated at Posted at 2014-10-19

gitリポジトリを公開するために

dotfilesの管理、今までは中途半端にDropbox+gitでやってたのですが一念発起してgithubに任せることにしました。

とはいえ大昔のパスワード直書きしてたファイルとか含んでるのでそのまま公開は不可能。
いきなり有料版githubに手を出すのもアレなので、ヤバいファイルは手元で穏当なファイルに書き換えてやることにしました。

さかまく ぎんがを つらぬいて

リポジトリ全体に対して特定コマンドを実行するのには git filter-branch コマンドが使える。
filter-branchを実行するとコミットのハッシュ値が変わり、元々のリポジトリとの連続性が失われるためpushできなくなる。
手元の変更は全てリモートにpushしてから以下のコマンドを実行すること。

$ git filter-branch --index-filter "cp -f /fake/nopassword.txt password.txt --prune-empty
これでpassword.txtは最初から穏当なnopassword.txtだったことになった。
失敗したらもう一度リモートから引っ張ればいいはずだが、怖いので一回ブランチ切って試してから本番を行った。
複数のブランチに一括で行うには、前述のコマンドを--で抜けてから-allとするらしい。(試してない)

参考:Git - 歴史の書き換えなど

オソウジダイスキ

git reflogコマンドで参照するデータは通常のコミットと独立に管理されているらしい。そっちも消す。
こっから曖昧な理解で言ってるので間違ってる可能性大。

$ rm -rf .git/refs/original/
実際のコミットデータ(オブジェクト)とハッシュ値を結びつけているrefsデータの消去。
これでgit showなどから辿れなくなる。
$ git reflog expire --expire=now --all
リポジトリに対する変更全てを管理しているreflogの強制失効。
これでgit reflogから辿れなくなる。
$ git gc --aggressive --prune=now
即座にデータベースを最適化、履歴を圧縮して上記の変更を有効にする。これをやらないと実際はしばらくデータが残る可能性あり?

倍プッシュ

今回はgithubに初めてpushするので普通にやればおk。
既存のgithubリポジトリの場合、コミットのハッシュ値が変わったため git push -f origin でgithub側を強制上書きするしかない。よくよく確認しないと悲劇が起こりそう。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5