最近想在子項目中試一下 darcs ,替代原來的 svn 。只是嘗試一下。
之前都是在本地玩 darcs 的,沒遇到多少問題。今天找了臺 freebsd 的機器,做了一個集中的倉庫。沒想到遇到許多麻煩。
我的想法很簡單,在集中倉庫的機器上建一個專有用戶,把幾個項目相關人員的 key 都放進去,大家都可以通過 ssh 訪問這臺機器。那么所有人都可以方便的通過 darcs get/put/pull/push 操作倉庫了。
從 freebsd 或 linux 上遠程操作這個倉庫都沒有多少問題,問題出在 windows 上。windows 版的 darcs 在提交文件時,一旦 patch 過大,就很容易失敗。弄了一天才把問題弄明白。
一開始懷疑是 darcs 版本不匹配,patch bundle 文件不兼容。因為 freebsd 上裝的是 2.0.2 版,而 windows 上是 2.0.0 版的。提交失敗時,總會報一句,
darcs failed: Malformed patch bundle: '[init' is not 'Context:'
貌似我的 init 這個 patch bundle 格式錯誤。嘗試了老版的倉庫格式還是依然存在。
google 了一下,有許多人遇到跟我一樣的問題,但是沒有人解答。我試著找 2.0.2 版的 windows 下編譯好的 darcs 未果。想自己在 windows 下 build 一個出來,怎么弄都沒搞定,放棄。轉而去 freebsd 下自己 build 了個 2.0.0 版的 darcs ,可問題依舊。
我用 darcs send -O 生成 patch 文件,再用 scp 放到遠程機器上,然后 ssh 登陸 darcs apply 一下卻沒有問題。確定不是版本不兼容問題。
通過修改 DARCS_SSH
設置了一個 bat 文件間接引導 ssh ,以此觀察 darcs 如何調用 ssh
工作。發現,在 darcs push 的時候,其實就是在遠程機器上運行了 darcs apply ,然后等待標準輸入。這邊通過 ssh 把
patch bundle 發送過去。
由于小的 patch bundle 沒有問題,問題都出在文件太大的時候。讓人懷疑是 windows 控制臺的問題。胡亂改了一些 windows 控制臺的屬性,并反復測試,發現同樣大小的 patch bundle ,有時候可以正常工作,有時候卻不行。很難確定具體原因。癥狀就是:從 ssh 建立的管道發送過去的輸入數據不完整。
最后,放棄使用 mingw 版的 darcs 以及 putty 帶的那個 plink (ssh)工具;裝了一個 cygwin 以及 openssh 。一切就正常了。另外,如果用 cygwin + putty 的 ssh 也有問題。
我估計很大可能出在那個 darcs 的 windows 包中帶的 ssh.exe (其實就是 putty 的 plink.exe )這個工具上。windows 糟糕的管道設施或許也有責任。
哎,在 windows 上跑 *nix 的命令行工具就是問題多多啊。
隨手記錄下這失敗的一天,希望可以幫助到遇到同樣問題 google 到這里的人們。
順便宣傳一下 darcs ,雖然 windows 版很是折磨了我一次,但東西還是很好用的。如果你有 svn / cvs 的經驗,很容易切換過去。下面列幾條基本指令,前幾條大約可以跟 svn 對應起來,但不完全一致。
darcs get == svn co
darcs put == svn import
darcs pull == svn up
darcs push == svn ci
darcs record == 本地提交
darcs send == 發送/生成 patch bundle
darcs apply == 打上 patch bundle
darcs 是沒有版本號的,工作理念跟 svn 很不一樣,但是很人性,容易讓人接受。推薦有興趣的朋友試一試。
原文:http://blog.codingnow.com/2008/08/darcs.html