2012年2月23日 星期四

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 不及的.

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

沒有留言:

張貼留言