2012年2月23日 星期四

SVN folder as sub module of GIT

這是上一篇中 '方法B' 的筆記

1) Prepare svn:// protocol:

(NOTE: don't use file:/// because it might has file format compilable problem)

In my case:

    1. svn repo at d:\work\repo\my_projects

    2. set svn service (I had set root at d:\work\repo) and make sure service was activated

    3. test svn checkout from svn://localhost/my_projects (or relative to yout root  in step2) has no polblem

    where repo tree is like:

    svn://my_projects/bla1/...
                     /bla2/...
                     /src/boo1/...
                     /src/boo2/...
                     /src/boo3/...
                     /src/...


    (NOTE: I don't use /trunk /branches /tags naming layout)
 

2) Purpose: 

the svn://my_projects/src/boo3/* is the library part, I need it to be used as

a git clone where in d:\work\my_test\boo3-clone

so git://d:\work\my_test\boo3-clone

will sync to/and from svn://localhost/my_projects/src/boo3


3)  using msysgit:

1. use GIT for windows' 'GIT bash here' at d:\work\my_test

2. use 'git svn clone url_of_svn_repo folde_rname

(NOTE: if using /trunk /branches /tags naming layout, use 'git svn clone -s ...' as -s is -stdlayout)

3. in my case

$ git svn clone svn://localhost/my_projects/src/boo3 boo3-clone
Initialized empty Git repository in d:/work/my_test/boo3-clone/.git/
r75 = 1324d83fab0b6d93f526b8f8252e8404d49c9e08 (refs/remotes/git-svn)
        A       boo3.vcxproj.user
...
        A       boo3.dsw
        A       boo3.vcxproj.filters
        A       boo3.dsp
r80 = 9f6afc8b5c2d68c4901de44a99e946b9edab5926 (refs/remotes/git-svn)
..
        M       boo3.dsp
r81 = cbb1be75466bfb695c76c8366828af3fd7c03a80 (refs/remotes/git-svn)
Checked out HEAD:
  svn://localhost/my_projects/src/boo3 r81


4. so now d:\work\my_test\boo3-clone had filled as a git repo where all files/folders/logs

   are the same as svn's

Ref: 使用 git-svn 整合 git 與 svn



 4) Another example by using TortoiseGit:

1. git svn clone setup


2. git svn clone done


3. add submodule


GIT 跟 SVN 一起工作的實驗作法...

情景:
-----
工作在 A project, 其中有一個子模組 B 是來自其他的 SVN controlled project

方法 A:
-------
目前的實驗作法, 是將子模組 B 當成一個目錄, 然後整個 svn checkout 到到該目錄, 此

時可以把他當作 project A 的一個目錄(與其他的目錄一樣) import/commit to GIT

A-+-B-1.c
  |   2.c
  |
  +-C-3.c
  ...

如上圖, 整個 A 是 GIT 控制的, 而 B 目錄是 checkout from SVN,

工作時以 GIT 為主, 如果有修改 1.c, 2.c 也把修改送上 GIT,

唯需要將 1.c, 2.c 的修改也送回 SVN (可以每次 GIT commit 後, 或累積數次) 時,

則切到 B 目錄上操做 SVN 的 commit 動作.

如果 B 的 SVN 源頭有新的修改, 也是在 B 目錄上操作 SVN update(or merge),

然後再 GIT commit 此次的 B 的 SVN update.

問題:
-----
B 目錄(並其子目錄) 下會有一大堆 .svn\* 的控制目錄(可能被隱藏起來)跟檔案.

GIT 不應該管控他, 如果這些檔案被送交 GIT, 則不適當的順序(commit 1.c, 2.c 沒有依先

SVN commit, 再 GIT commit...)操作, 有可能會毀掉 B 的 .svn 的控制.

解決:
-----

就不要把 .svn 之類的目錄跟檔案送進 GIT 控制, 方法是利用在 A 目錄(GIT project 根目錄)下

放一個 .gitignore 文字檔案.

裡面一行文字描述要 GIT 忽略的檔案類型

.svn*

p.s. 建議可以多加一些可忽略的檔案格式(如每次 build VS6/VS2010 都會重新產生的檔案)

.svn*
*.obj
*.pch
*.idb
*.pdb
*.log
*.tlog
*.suo
*.user
*.aps
*.clw
*.ncb
*.opt
*.plg

問題:
-----
如果是 M$ Windows 下, 是不永許產生"無前檔名"的文件 :(

解決:
-----

利用 msysgit 的 bash 環境產生!

開啟 GIT bash 切到 A 目錄下(或在目錄 A 上執行右選單的 GIT Bash here), 執行

>touch .gitignore

看看有沒有產生

>ls -al

explorer 打開目錄 A window, 也能看到 .gitignore, 此時用任何編輯器編輯他...

編輯好後存起來, 可以在 GIT bash 裡面切到 B 目錄, 執行

>git status

應該看不到 .svn 了...

git commit 時, 這些 .gitignore 裡面描述的檔案也是 "不會出現"




方法 B:
-------
一般比較正統的作法是用 git-svn 指令, 見 svn folder as sub module of git 描述方法

我實際試用了一次:

1. clone svn 步驟是需要學習的.

2. [印象中] 在我實際(當前 GIT) project, 我只要 SVN repo 個的一個子目錄(模組), 而非全部目錄,

   不容易這樣子做, 我試了許久, 繞了一圈有做出來, 但又好像怪怪的...

3. [印象中] 可以直接一次 git commit 就送回 SVN repo, 這是方法 A 不及的.

以上 [印象中] 因為時間過太久了, 我忘了為什麼又放棄此法, 有時間我還要再驗證一次.

2012年2月13日 星期一

TortoiseGIT 1.7.7 有感

從去年(2011)七月開始試用 GIT, 雖然一開始不太習慣, 但還是被他的快速吸引, 並有一些功能很特殊 like stash save 等, 只是我是一個 GUI 控, 版本控制用標準的命令列操作要記一堆指令跟打字, 我絕對無法面對, 我一直以來都是 TortoiseSVN 的愛用者, 當然就立刻裝了 TortoiseGIT 1.5 來用看看, 只是試用了一下, 充滿無奈, 有幾個嚴重的問題, 特別是 overlay icons 不正確, 如果直接由彈出選單操作也無法正確顯示有哪些檔案被修改過, 甚至會列出一大堆沒有修改的標為改過! 以上是 Tortoise 系列最重度需要的特色, 一度我開始找其他的 Free GUI clients 替代方案, like Git Extensions, SmartGIT 等, 試裝了結果又砍了, 因為操作直覺不順利, 其 UI 也醜, SCM 是每天必要的工具, 要快, 要順才對!
PC 上的 GIT clients 方案沒幾個, 試了一輪, 只好又回到 TortoiseGIT 上, 在其 issues 上參加討論 (有幾次使用上遭遇問題, 還會想乾脆來幫忙看怎麼修改? 只是自救都無暇了還幫人, 還是放棄該念頭.), 並改了用 nightly build 跟隨著, 因為我只用一個私人的小專案在 GIT 上, 所以輔助 MsysGIT GUI 一起操作還行, 所幸 TortoiseGIT 作者是積極的開發, 最後跟到 1.7.6 最後幾個 nightly build 我在乎的幾個問題都解了, 前幾日放出正式的 1.7.7, 謝謝該作者在開放軟體上無私的付出...
P.S. 不過美話說回來這幾版的 TortoiseGIT commit 花太多時間在 preparing (每次都要掃瞄目錄裡全部的文件!), 這好像比以前慢了(*)!?

(*)3/22 修正 : 過慢問題已經在 Issue 1085  提出並獲得修正,目前沒什麼可以挑剔的, 繼續使用了..