カテゴリー別アーカイブ: Git

git | マージのタイミングで毎回gcが発生する際の対処例

gitリポジトリを使った開発中に、何故かマージ動作が起きるタイミングで毎回git gcが実行されてしまう状態になりました。環境は次の通り。


$ git --version
git version 2.6.2.windows.1

マージが発生するコマンド全部(merge、rebase、その他)なので非常にウザいです。で調べてみてもよくわかりません。

そこで試したのが以下の手順

  1. git gc –aggressive
    ガッツリGCやってゴミを減らす
  2. git prune
    自動gcの後に「warning: There are too many unreachable loose objects; run ‘git prune’ to remove them.」と表示されたので実行

これで毎回gcが発生しなくなりました!やったね!

同じ状況になった人は試してみてはいかがでしょうか?

master以外でgit svn dcommitできなくする

!!! CAUTION !!!

このエントリはGit Advent Calendar 2014 – Qiitaではありません。

 

背景

訳あってセントラルリポジトリがSubversionだった場合、”当然”git-svnを使って開発を進めていきます。

そんなとき、たまに間違ってフィーチャーブランチ上でgit svn dcommitしてしまうことがあります。これをやってしまうとmasterをSVNと同期させるのが少し手間だったりします。

そこで、master以外ではgit svn dcommitできなくしてしまおうというのが、このエントリの趣旨です。

 

前準備

gitには当然コマンドをフックする仕組みがあります。しかし、標準のフック機構はgit-svnでは使えません。

そこで、まずは以下の「git-svn-hooks」を導入します。

rkitover/git-svn-hooks

導入手順がREADME.mdに書いてありますので、参考にして導入します。

なお、私の場合、次のような手順で入れました。

  1. ダウンロードしたgit-svn.shを~/binにコピー
  2. ~/.bashrcに次の記述を追加
    source ~/bin/git-svn.sh

 

フックスクリプトの作成

あとはgit svn dcommitをフックして、master以外のブランチでは警告メッセージを出すようにします。例えば、こんな感じの.git/hooks/pre-svn-dcommitファイルを作成します。

 

動作確認

任意のgit svn cloneしたリポジトリで、フィーチャーブランチを作ってgit svn dcommitすると、次のようにエラーになります。

$ git checkout -b some-feature
$ git svn dcommit
WARNING: curret branch is NOT "master"

これで安心してgit svn dcommitできますね!

git-nowにてカレントブランチのnowコミットだけfixupするようにした

 

問題

git-now --fixup

は内部で最初のgit-nowで作成したコミットを探す際、簡単にいえばログから最初のnowコミット(メッセージに”from now”が含まれるコミット)を抽出しています。しかし、これだとうっかりpushしてしまったコミットも含んで探してしまい、fixupしたくないところまでfixupしてしまいます。

 

対応

そこで、この問題の軽減として、フィーチャーブランチ上で作業しているときは、フィーチャーブランチに含まれるnowコミットだけをfixupしようと考えたわけです。

で、どうするか?

答えは「masterから分岐したコミットだけを対象としたログから最初のnowコミットを探す」です。そのために、git logを実行する際に

git log master..

のように「ログ取得対象のコミットを明示的に指定」してやります。上記の指定は、「masterからHEADまで」のログのうち、master部分のログを取り除いたものを取得できます。(参考:transitive.info – git log 使い方

 

こんなコミットグラフだっとします。

 

a-b <master>
   \
     c-d <*temp>

※<branchname>:ブランチ名(*はカレントブランチ)

コミットログを見るとこんな感じです。

$ git log --pretty=format:"%h %Cgreen%d%Creset %s"
cfeb93c (HEAD, temp) [from now] 2014/10/23 13:02:36
1f48b0d [from now] 2014/10/23 13:00:20
0a64b5f (master) [from now] 2014/10/23 12:46:36
b9656d0 [from now] 2014/10/23 12:46:25

ここで、master..を指定するとどうなるか?

$ git log --pretty=format:"%h %Cgreen%d%Creset %s" master..
cfeb93c (HEAD, temp) [from now] 2014/10/23 13:02:36
1f48b0d [from now] 2014/10/23 13:00:20

ご覧のようにmasterから分岐後の2つのコミットだけが取得できます。

この動作を利用したのが、今回の修正です。

 

なお

今回の記事を作成するにあたりこんな変更も加えました。

GistSharpExtension:VS14に対応しました

GistSharpExtension

VS 14 CTPも4まで来たので、正式リリースより二足ほど先に対応しました。

 

残念ながらVS 14の拡張機能マネージャーに出す方法がわからなかったのですが、ダウンロードしたVSIXを開けば、次のように問題なくインストールできます。

 

image

 

VS 14でも快適なGistライフを!

ASP.NET vNextのソースコードがGitHubで公開されました

Microsoftがやってくれました!!!

 

aspnet/Home https://github.com/aspnet/Home

ASP.NET vNext Home

In the next version of ASP.NET we are working with multiple teams around Microsoft to create a lean, composable .NET stack that provides a familiar and modern framework for web and cloud scenarios.

 

ソース公開を心待ちにしていた、「ASP.NET Identity」もその中には含まれていたので、時間をとって中身を見てみようと思います。

aspnet/Identity https://github.com/aspnet/Identity

.gitignoreはBOM付UTF-8で書いてはいけない

小ネタ。

編集

今日なんとなしに.gitignoreをVSで編集してBOM付UTF-8で保存したんですよ。

 

 

で、この状態でgit add . した結果がこちら。

 

image

 

除外したはずのbinフォルダーが含まれてしまっています。この結果から、BOM付UTF-8で保存した.gitignoreは、先頭行のファイル名にBOM部分も付けたものがファイル名と解釈されているようです。

 

一度リセット後、.gitignoreのエンコーディングをBOMなしUTF-8に直すと、git add .した結果は次の通り。

 

image

 

無事binフォルダーが除外されました。

 

というわけで、.gitignoreはBOM付UTF-8で保存してはいけない、という話でした。

git commit –allow-emptyなコミットは、git rebase -iの初期状態で無視される

小ネタ。

こんなリポジトリがあったとして。

image

“feature1”というメッセージの付いたコミットは、git commit –allow-emptyによるものです。

で、このときに、git rebase –i masterとすると……

image

空コミット行が、初期状態でコメントアウトされています。

なんでこんなことをしようと思ったかというと、「git commit –allow-empty を使った WIP PR ワークフロー – Qiita」を読んで、からコミットできるなら、フィーチャーブランチの最初にコメント書いちゃえばいいんじゃね?と思ったからでした。

でも、rebase -iで先頭行のコメント解除してから他のコミットをsquashとか、地味にめんどいので、お蔵入りかなぁ……