Category Archives: git

ソースコードにgitのhashを埋め込んでおく

ビルドの際にgitのリビジョン(sha1ハッシュ)をソースに埋め込んでおけば、デグレードが起きた際などにソースをかんたんに復元できるだろう。gitにはrev-parseというサブコマンドがあり、これでHEADの40桁のsha1を出力できるのでpythonで取得するには以下のように書けばいい。

check_outputはコマンドの出力を返してくれる(コマンドが0以外を返すと例外)。

あとはC++ヘッダーファイルなどに書き出して、ビルドすればよい。

gitおサブモジュールを使っている場合はこれで問題ないが、他のgitで管理しているソースも取り込んでいる場合には、それらのハッシュも記録しておいたほうがいいだろう。

git submoduleで特定のハッシュやタグでaddする

もともとsubmoduleは勝手に更新されたりしないので、普通にgit submodule addすると、そのときの最新状態に固定される。もっと古いものにしたいときは一旦addしてからsubmoduleのなかでgit checkout SOMETAG or HASHして、上のディレクトリでgit commitする。

実行イメージ

git cleanでいらないファイルを削除する

TLTR

git clean -Xi
または
git clean -Xid

便利コマンド -n

-nをつけるとドライランになって。実際には削除せず、何を削除するかを表示するだけなので確認するのに便利。

-X

.gitignoreで指定されているファイルを削除する。

警告がでる

clean.requireForceが設定されていなくてデフォルトでtrueになるので、もっとオプションが必要らしい。

  • -i: インタラクティブ、一個ずつ確認しながら削除する。
  • -f: clean.requireForceを無視して削除する。

-irmなどと違ってすごく高機能。

危険領域

-X.gitignoreで指定されているファイルを削除するので一番安全と思われる。-Xをつけないとgit statusで表示されるようなuntrackedなファイルも削除する。しかし前述のようにclean.requireForcefalseでない限りは追加オプションが必要になるので危険性は弱くなっている。-fだけで実行すると大事なファイルが削除されてしまう可能性が高い。しかし-dをつけないとディレクトリは削除されないようになっている。-iが高機能なので-fは一切使わないほうがいいだろう。

ファイルの特定の行を変更したコミットの差分を見る

git blame

これは、funcs.cというファイルの814行目から10行の部分を変更したのは誰なのかを表示する。

git log -L

git log -Lを使うには1.8.4以上が必要らしい。

コミットメッセージも表示してくれる。
変更が81f15c2b0d6e9eaf524ff7bab37426c21af75fb7によることは分かったので、これと一個前との差分を見る。

差分

これでコミット全体の差分が見れた。

この差分をgithubで見るにはhttps://github.com/file/file/commit/81f15みたいなURLになる。

参考

https://stackoverflow.com/a/19757493 made by Matt McClure CC BY-SA 3.0

git がremote: aborting due to possible repository corruption on the remote side.

レポジトリに大きいファイルがあるか、レポジトリ自体が大きいとこうなるようだ。1つの解決法は少しずつfetchする。

これはレポジトリを全部持ってくる場合だが、その必要がなければ最初の–depth 1だけでもpushなどはできる。