git filter-branchを使ってレポジトリの中の一部だけを追いかけたい願いを叶える

こんにちはNEKOGETです。
githubにあがっているもので、特定のフォルダの中だけコードを追従したい場合とかありますよね。
具体的に言うと…..

フレームワーク(CodeIgniter)のgitレポジトリの中にドキュメントが入っていて、これの日本語化をしたい。
ソースコードはいらん。ドキュメントだけの変更を追いたい!
こういう場合です。

しばらく方法を悩んでいたんですが、できました。
方法としては次の通りです。

{フォルダ名}のところは適当に置き換えてください。

(1) gitレポジトリを cloneします。
(2)cloneしたフォルダを{フォルダ名}という名前でコピーします。
(2)のコピーしたフォルダの中でフォルダを指定してgitの情報をフィルターをかけます。

$ git filter-branch -f --subdirectory-filter {フォルダ名} HEAD

そうすると、指定したフォルダの履歴だけがフィルタリングされ、そのフォルダだけのレポジトリができます。
そうやってできた抽出レポジトリをcloneして、(3)作業用のレポジトリを作ります。

(3)の作業用レポジトリをリモート(今回試したのはgithub)にpushします。

ここまでで、取り込むための環境ができました。
追従元の変更の取り込み

(2)のgit filter branchを実行した{フォルダ名}を削除します。
(1)の最初に作った追従元からつくったcloneで、git pullを実行し、変更を取り込みます。
それをコピーし、{フォルダ名}を作り直します。git filter-branchを実行し、抽出したレポジトリを作成します。
つまりは(2)を作り直します。

(3)作業用レポジトリは、抽出後の(2){フォルダ名}から変更をmergeします。

つまり抽出されたgit レポジトリからmergeをすることによって、全部入りのオリジナルの変更をとりこむわけです。
(2)は取り込む作業をする都度削除します。した図のピンクのレポジトリがそのフォルダになります。

日1回程度取り込めれば良いので、
shを用意しcronで定期実行することにしました。
これで追従したいレポジトリから変更を取り込めます。

参考にさせてしただいたサイト : http://subtech.g.hatena.ne.jp/secondlife/20101108/1289221814
git filter-branchをここで初めて知りました。

CodeIgniter本家のレポジトリから、ユーザーガイドだけを抽出したレポジトリです。
3.0以降のユーザガイドの翻訳に利用しようと思います。
https://github.com/NEKOGET/ci_user_guide_src
(注 : 2014.1.1 レポジトリ名を変更しました)
もっとスマートでうまいやり方があればぜひ教えてください(=人=)

Tracでgit

git

Tracでgitですが、結局躓いていた原因は、trac.iniの設定不足だったようです。
とりあえず、tracでgitが使えることはわかりました♪

1つのプロジェクトに1つのtracで完結。
フォルダごとバックアップをとっておけばそれでOKな手軽さが素敵でまだまだ手放せそうにありません(笑)
(redmineも気にはなってるんですけどね(><)

[components]
tracext.git.* = enabled
...(略)

[git]
cached_repository = true
git_bin = /usr/local/bin/git
persistent_cache = true
shortrev_len = 7

[trac]
...(略)...
repository_dir = /home/apache/git/nekoget/.git/
repository_type = git
...(略)

■躓いた後、うまくいった原因かもしれない事柄は次の2点
(もうすこしきちんとメモをとりつつ、取り組めばよかったなと反省)

サーバ上のgitは1.6.4から1.6.3にダウングレード
(checkinstallでrpmを作成し、インストール)

レポジトリのディレクトリを最初/home/apache/git/nekoget/に作ったのだけれども、うまくいかないので/home/apache/git/nekoget/.git/に変更。

■環境(?)

TRACはTrac 0.11.2.1.ja1
インタアクト株式会社 様が配布くださっている日本語版TRAC

gitは1.6.3
checkinstallでrpmを作成し、インストール

OS:Fedora 8

Python 2.5.1

git21.gif
rootでコミットを試しちゃったのがばれちゃう恥ずかしい画像(笑)

gitでtrac(途中)

参考にさせていただいたサイト:http://trac-hacks.org/wiki/GitPlugin

trac

Fedora環境下で環境を作成途中です。
tracのバージョンは0.11.2.1
gitのバージョンは1.6.4

trac.logのエラーログはこれ。

2009-08-31 15:26:20,801 Trac
[git_fs] ERROR: GitError: Could not retrieve GIT version

たぶんもう少し!

メモ 66行目あたり 0.11/tracext/git/git_fs.py??? 
.aggを作るためにエクスポートしたファイル
たぶんこのあたりのコードが関係していそうな気がするものの….pythonよくわからない(><)

self._version = None

		try:
			self._version = PyGIT.Storage.git_version(git_bin=self._git_bin)
		except PyGIT.GitError, e:
			self.log.error("GitError: "+e.message)

2009.09.06 追記
ひょっとしてself._version =のところに、gitのバージョンを手打ちするとかすると動くとかいうことはないんだろうかな(妄想)

2009.09.06 追記
http://trac-hacks.org/ticket/4227
これのような気がする。

2009.09.15 追記
tracでgit動くようになりました。
trac.iniの設定と、gitのバージョンを1.6.3に下げました。
詳細については、また改めてブログで報告します。

Windows環境でgit

http://sourceforge.jp/projects/tortoisegit/

最新版をソースから・・・・・と思いつつ
とりあえずお手軽にtortoisegitをインストール
インストール方法:sourceforeのwiki

git:http://git-scm.com/

git関連のサイト
http://sourceforge.jp/magazine/09/03/26/0834222
Subversionリポジトリと連携できるgit-svnより

「Gitを使いたいが、中央リポジトリにはSubversionを使わざるを得ない」という場合も多いだろう。そのような状況で便利なのが、 SubversionリポジトリとGitリポジトリの橋渡しをする「git-svn」である。git-svnを利用することで、SubversionリポジトリとGitのローカルリポジトリを同期させることが可能だ。

git入門
http://www8.atwiki.jp/git_jp/

Git はLinuxカーネルの開発で使用されている分散バージョン管理システムです。
このページでは Git のマニュアルの日本語訳、Tips、Gitの改版情報などを載せていく予定です。

Gitを使いこなすための20のコマンド
http://sourceforge.jp/magazine/09/03/16/0831212

LinuxカーネルやRuby on Rails、Perlなど、近年多くの大規模プロジェクトで採用されているバージョン管理システムが「Git」だ。Gitには非常に多数のコマンドが用意されているが、日常的に使用するコマンドは20個程度と言われている。本記事では、Gitを使いこなすために覚えるべき20個のGit基本コマンドを紹介する。

git勉強会(動画)

git勉強会
http://pneskin2.nekoget.com/press/?p=146

2008年に開催された、php-hackathon主催のgit勉強会の動画。
結構長時間の動画で、この頃はまだtwinpact100を持っていなかったので画面キャプチャの画像がないのでわかりにくいかもしれませんが、とてもオススメ!

——————————-

追記:2009.08.30 23:35
http://code.google.com/p/msysgit/
Git-1.6.4-preview20090730.exeをダウンロード。
gitのバージョンを1.6.1から1.6.4に更新しました。
1.6.1では使えなかったgit svnが使えるようになりました。
git GUIで操作をして、チェックアウト。 r1255がcloneできました。
少々大きくても大丈夫そうです。

追記:2009.08.31
自宅サーバに1.6.4のrpmを作成しインストール。
リモートレポジトリとのやり取りも成功。