ここがヘンだよgit

最近gitと挌闘していて、まだまだ決着は付きそうにないんですが決着を待ってるといつまでも終わらなそうなので一旦ここで記事にまとめてみようかと思います。*1
基本的なgitの使い方は置いといて、弄っていて気になったgitの仕様について。
書いたとおりまだまだ挌闘中なので、間違ってたら指摘してくださると大変助かります。

空のディレクトリを管理できない

割とあちこちで言われているけど、空のディレクトリは管理できない。何かしらファイルを置く必要がある(.gitignoreを置く事が多いっぽい)。
これに関してTwitterぼやいていたら、kanaさんにgitはcontent trackerなのでcontentのない空ディレクトリは対象外だと教わった。
その時は「なるほどー」と思ったんだけど、後々よく考えるとやっぱりおかしくないか?

  • contentがないという意味では、空のファイル(0バイトのファイル)はcontentがない。にもかかわらず、空のファイルは管理できる。
  • "ディレクトリの存在"自体をcontentとして捉えることもできるはず。
  • (ディレクトリがcontentじゃないなら当然だけど)空のディレクトリのみを含んだディレクトリも管理できない。

まー結局は考え方次第ってことなんだろうけど。できないよりかはできる方が明らかに便利だと思うのにそうしてないってことはやはり何かしら経緯があったのだろうか。

コミットのないリポジトリをcloneできない

「そもそもできる必要あるの?」って声が聞こえてきそうだけど。
Subversionから入った人からすると、リポジトリは最初作った時は空で、そこからcheckoutして、ファイル追加してcommitって流れなわけで。
gitは分散型なので、そもそも使い方が違うんだろうけれども。
でも、githubなんかを使ってみると、そういう使い方ができればSubversionから入った人がわかりやすいんじゃないかなー。
欠点とは言わないけれど、空のディレクトリと同じで、できないよりかはできた方がいいんでないだろうかと思った次第。

部分的なチェックアウトができない

最初できないと知って、「不便じゃないかなー」とも思ったけれど、Subversionではbranchやtagをコピーとして扱う関係もあって部分的なチェックアウトは必須だっただけで、gitでは両方とも素でできるし、そんなに困った状況は発生しないのかな?
でも、branchやtag抜きでもリポジトリの任意の部分を扱いたいってことたまにある気がする。そういうのはあらかじめ別リポジトリにしてsubmoduleを使うしかないのかな?
まあでも内部での管理方法を考えると部分チェックアウトはそもそも難しそうだ。


もともとSubversionを使っていたのでSubversionとの比較が多いけど、別にSubversionの方が優れてるとは思ってない。そもそも、コンセプトが全然違うんだな、と触ってて思った。
gitはbranchやmergeが手軽にできて強力だし、オレオレリポジトリが手軽にできるのもいい*2。是非使いこなせるようになりたいです。格闘の日々は続く。

*1:書いてていつも思うけど、まとめてみるとか書いといて全然まとまってないな。どうもまとめるの苦手。

*2:ただしまだ使いこなせていないが