2011-06-18 55 views
0

我想使用git-svn將公司的svn repo加載到git中,但不幸的是我的一位同事在分支名稱中創建了一個帶有非法字符(\)的分支。現在,當我試圖導入的整個歷史,git的退出與一個錯誤:如何使用git-svn將帶有非法分支名稱的svn reposirory轉換爲git?

fatal: Cannot lock the ref 'refs/remotes/feature-\\-bar'. 
update-ref -m r4 refs/remotes/feature-\\-bar 471d9622546803b3712a436c2e2ed6b1490c829a: command returned error: 128 

我可以沒有分支,因爲它是在過去的方式是這樣,但是我不想失去所有的歷史直至合併分行。我試過--ignore-path選項,但是我無法讓它工作,主要是因爲我懷疑它只處理分支/主幹路徑內的路徑(??)。 有沒有人知道通過任何機會解決這個問題的方法?

回答

0

我會在任何分支機構的頭部啓動git repo - 手動將分支名稱設置爲git-friendly。對於較舊的歷史記錄,可在需要時以此方式導入有時候,進口svn歷史的痛苦根本不值得,它們完全遵循完全不同的機制。

0

我不得不忽視一些分支,因爲他們使用的是非法字符,我無法使用git svn(在我的案例中,字符是:/)。

解決方法1:手動添加額外的SVN倉庫,每個分支

git svn init -s [svn-repository-url]初始化存儲庫後,我評論的分支配置.git/config出:

[svn-remote "svn"] 
    url = [svn-base-url] 
    fetch = [project-name]/trunk:refs/remotes/trunk 
    #branches = [project-name]/branches/*:refs/remotes/* 
    tags = [project-name]/tags/*:refs/remotes/tags/* 

爲了以後增設機構,我將通過爲每個分支添加新的svn位置來做到這一點,例如

[svn-remote "svn-your-branch"] 
    url = [svn-base-url] 
    fetch = [project-name]/branches/your-branch:refs/remotes/your-branch 

來源:How do Git SVN ignore-paths work (ignoring daily build tags)?或有一些實際的配置,例如, http://www.dmo.ca/blog/20070608113513/

解決方案2:明確說明您的配置你喜歡的分支

您可以定義分支.git/config獲取:

[svn-remote "svn"] 
    url = [svn-base-url] 
    fetch = [project-name]/trunk:refs/remotes/trunk 
    branches = [project-name]/branches/{your-branch-1|your-branch-2}:refs/remotes/* 
    tags = [project-name]/tags/*:refs/remotes/tags/* 

如果它是安全的,之後再添加分支從svn結帳一切,我會更喜歡這個解決方案。

來源:https://stackoverflow.com/a/3844508/709431

爲什麼忽略路徑不工作?

根據http://go-dvcs.atlassian.com/display/aod/Advanced+git-svn+optionsgit svn --ignore-paths只忽略提交的內容。因此,它仍然會爲分支名稱創建一個ref。如果分支名稱包含非法字符,則失敗。 (此外,與您的假設相反,ignore-paths匹配除URL部分之外的所有內容,例如,使用上述配置(如project-name/branches/your-branch-1)。)

相關問題