【解決済】gitで、あるコミット時のソースコードを、ちらっとlessとかで見たい場合のコマンドって、なにかしら?diffはいらないの。

2013-12-20 15:02 追記

速攻で解決した。インターネット素晴らしい。


元記事

という発言があって、twitterで以下のやり取りをしました。



「確かに一時的にgit coでファイル取り出すことあるけどもっと楽な方法あるのかなぁ?」と探したもののググる力が足りず、最後にgistで書いた以下のような力技になりました。



ただ、適当実装だし、再発明してる感じもするので既にあるなら知りたいところ。
どうすると良いんでしょうか?

他のbranchの内容を調べる時はgit grepしてgit showする

「前に書いたmethodがなくなってるなぁ」
「あぁ、あれ違うbranchで作ったmethodか」
みたいなことを調べる時にタイトルのようにやればいいみたい。

まずはgit grepで違うbranchから探したいものを検索

 (git)-[hotfix/2.4.20]-[12:30]% git grep isUniqueWith feature/m48                                                                     [/Applications/MAMP/htdocs/lib]
feature/m48:app/Model/Enticement.php:            'isUniqueWith' => array(
feature/m48:app/Model/Enticement.php:                           'rule' => array('isUniqueWith', 'company'),
feature/m48:app/Model/Enticement.php:    public function isUniqueWith($data, $fields)

CakePHPのcore部分をgit submodule化してgithubで管理する

2011-11-09追記

  • app/webroot/test.phpのCAKE_CORE_INCLUDE_PATHを修正することを書いてなかったので追加
  • bakeのときにはappディレクトリを指定する必要があることを追加

ここから元記事

CakePHP as a Git submodule | Bravo Kernelの通りやればできる。
重要なのはapp/webroot/index.phpを修正してCAKE_CORE_INCLUDE_PATHのディレクトリを指定することくらい

前提

  • CakePHP2.0
  • Webサーバのdocrootは以下の通り
~/Sites/docroot/

submodule化の流れ

.gitを削除

[17:53]% rm -fR .git                                                                  [~/Sites/docroot]


cake本体を削除

[17:54]% rm -fR lib                                                           [~/Sites/docroot]


後々考えてgitignoreを作成

[17:55]% touch .gitignore                                                     [~/Sites/docroot]


初めのcommit

[17:55]% git init                                                             [~/Sites/docroot]
Initialized empty Git repository in ~/Sites/docroot/.git/
[17:55]% git add .                                                            [~/Sites/docroot]
[17:55]% git commit -m 'first commit'                                         [~/Sites/docroot]
[master (root-commit) 6083f1c] first commit
 436 files changed, 67172 insertions(+), 0 deletions(-)
# 以下略


git submoduleでcakeを追加

[17:55]% git submodule add https://github.com/cakephp/cakephp.git             [~/Sites/docroot]
Cloning into cakephp...
remote: Counting objects: 134378, done.
remote: Compressing obje
# 以下略


submoduleを初期化

[18:05]% git submodule init                                                   [~/Sites/docroot]
Submodule 'cakephp' () registered for path 'cakephp'


念のためupdate

[18:06]% git submodule update                                                 [~/Sites/docroot]


cakephpのgitを切り替えたいので一旦中に入る

[18:06]% cd cakephp                                                           [~/Sites/docroot]


ローカルに「2.0.2」というbranchを作り、stableであるCakePHP2.0.2のtagデータをcheckoutする

[18:08]% git checkout -b 2.0.2 refs/tags/2.0.2                        [~/Sites/docroot/cakephp]
Switched to a new branch '2.0.2'


戻る

[18:09]% cd ..                                                        [~/Sites/docroot/cakephp]


CakePHPのCoreのディレクトリを修正しないといけないのでapp/webroot/index.phpとテストをするのでapp/webroot/test.phpを修正する

# vim app/webroot/index.phpでCAKE_CORE_INCLUDE_PATHを以下のように修正
    //define('CAKE_CORE_INCLUDE_PATH', ROOT . DS . 'lib');
    define('CAKE_CORE_INCLUDE_PATH', ROOT . DS . 'cakephp' . DS . 'lib');


commitするためにgit addする

[18:15]% git add app/webroot/index.php                                        [~/Sites/docroot]


git commit

[18:15]% git commit                                                           [~/Sites/docroot]


最後にgit hubにpush

# githubのCodeタブに書いてあることを丸写し
[18:17]% git remote add origin うんちゃらかんちゃら              [~/Sites/docroot]
[18:18]% git push -u origin master                                            [~/Sites/docroot]


できたできたー。簡単。

bakeを使う場合

bakeを使う場合には/webroot/index.phpを通らないのでappのディレクトリを指定する必要がある

[16:43]% ./cakephp/lib/Cake/Console/cake -app app bake                        [~/Sites/fmn/cakephp]

gitinstawebを試す。リモートリポジトリとローカルリポジトリを作ってみる

gitinstawebだとかgitweb.cgiの存在を全然知らなかったのと、
MacBook内にリモートリポジトリを作ってみてgitの管理をやったことなかったのでちょっと試してみた
参考:Git -

前提

  • ローカルリポジトリもリモートリポジトリもMac OS Xで動かす
  • リモートリポジトリは~/Documents/gitrepos
    • つまりそのディレクトリ配下に色んなプロジェクトの.gitが集まる
  • ローカルリポジトリはどこでもいい。プロジェクトごとに好き勝手なところで開発する
  • gitweb.cgiが見るディレクトリはリモートプロジェクトである~/Documents/gitrepos
  • 今回はgitreposというプロジェクトを作ってみる

やってみる

初めにベアリポジトリ(要はそのプロジェクトの .git ディレクトリだけで構成されるもののことらしい)を作る

[17:35]% mkdir gittest.git                                                              [~/Documents/gitrepos]
[17:35]% cd gittest.git                                                                 [~/Documents/gitrepos]
[17:35]% git --bare init                                                    [~/Documents/gitrepos/gittest.git]
Initialized empty Git repository in /Users/no-kumagai/Documents/gitrepos/gittest.git/


この状態でbranchを確認してももちろん何も出ない

[17:35]% git branch -v                                                      [~/Documents/gitrepos/gittest.git]
[17:43]% 


/tmpにgittestというプロジェクトを作り、readmeを作ってみてコミットまでやる

[14:53]% mkdir gittest2                                                                               [/tmp]
[14:53]% cd gittest                                                                                     [/tmp]
[14:53]% git init                                                                [/tmp/gittest]
Initialized empty Git repository in /private/tmp/gittest/.git/
[14:53]% touch readme                                                                           [/tmp/gittest]
[14:53]% git add readme                                                          [/tmp/gittest]
[14:53]% git commit -m 'first commit'                                            [/tmp/gittest]
[master (root-commit) 263288e] first commit
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 readme
[14:53]%   

(branch情報を見てみるとこんな感じ)

[17:06]% git branch                                                                             [/tmp/gittest]
* master


「git remote add」でリモートリポジトリをgitに教えて上げる。originという名前で登録。

http://progit.org/book/ja/ch4-1.html によると「git remote add local_proj /opt/git/project.git」こんな感じ
[17:42]% git remote add origin ~/Documents/gitrepos/gittest.git                                 [/tmp/gittest]


リモートリポジトリにあるリモートブランチのoriginに、さっき作ったローカルブランチであるmasterをpushしてあげる

[17:43]% git push origin master                                                                 [/tmp/gittest]
Counting objects: 3, done.
Writing objects: 100% (3/3), 205 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /Users/no-kumagai/Documents/gitrepos/gittest.git
 * [new branch]      master -> master
[17:43]% 

(リモートリポジトリであるgittest.gitでbranchを確認してみると確かにローカルブランチの情報が入ったのがわかる)

[17:46]% cd ~/Documents/gitrepos/gittest.git                                [~/Documents/gitrepos/gittest.git]
[17:47]% git branch -v                                                      [~/Documents/gitrepos/gittest.git]
* master 263288e first commit
[17:48]%    


最後に「git instaweb」するとgittestの情報が見れる

[17:50]% git instaweb --httpd=webrick                                                           [/tmp/gittest]

(止める時は--stop付ける)

[17:50]% git instaweb --httpd=webrick --stop                                                    [/tmp/gittest]
[17:50]%   


わーい、できたできた。
Git - Bookちゃんと読んだことなかったのだけど読みやすくていいなぁ。