2008-12-08 136 views
51

治療我的存儲庫作爲SVN回購,我得到:如何使用git-svn讓svn:external保持最新狀態?

svn co http://myrepo/foo/trunk foo 
... 
foo/ 
    bar/ 
    baz/ -> http://myrepo/baz/trunk 

把它當作一個Git回購,我得到:

git svn clone http://myrepo/foo --trunk=trunk --branches=branches --tags=tags 
... 
foo/ 
    bar/ 

我可以克隆巴茲到我的本地機器上的其他地方,並添加符號鏈接,但這只是一個黑客。有沒有辦法讓git svn rebase在更新其他所有內容時自動引入這些更改,就像svn up一樣?

+0

我知道我在什麼地方閱讀有關如何使用Git子模塊中設置的,但我不能找到鏈接。 – JesperE 2009-01-23 18:56:19

回答

22

我結束了使用的解決方案是隻是符號鏈接到其他git-svn克隆我的本地框。這工作得很好:它可以讓我提交更改回來,它可以讓我做項目一個地方的變化只是爲了讓他們進入項目B.

24

將svn externals與git-svn整合的最佳方法是我看到的script,它將您的外部文件克隆到.git_externals /目錄並創建符號鏈接並排除您需要的文件。我覺得這是一個簡單而直接的解決方案。因人而異。

下面是用於處理與混帳SVN SVN的外部其他選項的older overview。對我來說,他們看起來有點過於複雜,並且很容易在隨後的Git使用中破解。

+0

這似乎不適合我(這裏的外部是相對鏈接到同一個存儲庫)。 – 2011-12-05 13:47:18

1

我決定寫一個「簡單」的Perl腳本來處理這一切我的東西。我已經把它最近放到github,試試看,也許它會幫助:http://github.com/sushdm/git_svn_externals/

它基本上爲所有外部找到的git-svn克隆,並且它遞歸地查找它們,克隆,將它們符號鏈接到適當的位置,並排除所有.git_externals目錄和符號鏈接,以便仍然可以使用'git svn dcommit'。

祝你好運。

4

我還做了一個腳本(包括Perl和Ruby的兩種型號),這是否對我來說,這是在http://github.com/liyanage/git-tools/

  • 遞歸檢查出所有的svn:externals的
  • 能的情況下,反覆運行大型倉庫的克隆中止一半。發生在我身上很多。它從它離開的地方開始。
  • 將所有的svn:externals的條目發現和流程的.git /信息/排除
  • 將所有的svn:忽略它遇到到git的條目/信息/排除
  • 可以定期在第一次運行後運行在所有克隆的子沙盒中執行svn:rebase,發現新的外部和新的svn:忽略

更新:我不再維護此腳本。它的遞歸克隆和更新SVN存儲庫以及其他git相關功能的功能在我正在積極維護的這個新項目中可用:http://liyanage.github.com/git-tools/

+0

我可能無法讓你的工具工作。 – 2010-08-03 22:37:30

+1

我想知道什麼對你不起作用,所以我可以改進腳本。你能聯繫我嗎? – 2010-08-16 16:19:45

+0

有很多叉子。有誰知道他們哪一個在msysgit的windows上工作?鏈接的版本只是掛起。 – axk 2012-03-02 14:33:07

4

我剛剛寫了一個簡短腳本,用於檢出當前所有svn:externalsHEAD添加到根目錄並將它們從git存儲庫中排除。

它的地方.git/hooks/post-checkout,它會保持這些外部檢出最新每當工作樹改變,例如由於git svn rebasegit-checkout

#!/bin/bash 
set -eu 

revision=$(git svn info | sed -n 's/^Revision: \([1-9][0-9]*\)$/\1/p') 
git svn -r${revision} propget svn:externals | head -n-1 | { 
    while read checkout_args 
    do 
     checkout_dirname=$(echo ${checkout_args} | cut -d' ' -f3) 
     svn checkout ${checkout_args} 
     if [ -z $(grep ${checkout_dirname} .git/info/exclude) ] 
     then 
      echo ${checkout_dirname} >> .git/info/exclude 
     fi 
    done 
} 
2

只用於記錄:我遵循this建議並試圖用SmartGit來處理svn:externals

SmartGit是迄今爲止我見過的Git中最好的GUI客戶端。關於svn:externals,它不僅能夠正確提取它們,而且還提供了對外部存儲庫執行「快速快照」(只讀,僅限HEAD的克隆)的選項。

不幸的是它不是免費的商業用途(我發現許可證價格有點太高 - 是的,我是一個小氣鬼)。儘管如此,它也可以用於非商業目的。

0

這是我所做的。

首先我創建一個空的SVN回購(對於相同的根目錄作爲GIT):

svn checkout --depth empty http://path/to/repo . 

這在GIT根目錄中創建空svn的。重點是包含SVN外部屬性。

接下來我簡單地只檢查的外部(我放在PATH Cygwin的工具):

svn propget svn:externals | sed -e 's//.\//' | sed -e 's/\'//g' | xargs -L1 svn co 
相關問題