2010-07-21 145 views
1

我剛剛開始使用git並使用它與SVN存儲庫進行交互。將svn的是在一個標準的格式,所以我配置我的沙箱git-svn-rebase正在使用SVN標記

git svn clone <repo> -s 

一切似乎開始罰款,但經過幾次底墊,dcommits和標籤我似乎總是commiting到SVN標籤。做一個dcommit預演回報:

$ git svn dcommit --dry-run 
Committing to http://proj.badc.rl.ac.uk/svn/badc/users/spascoe/metaconfig/tags/0.1.1 ... 
diff-tree a1265119164b79cfb12d28a7059d453fb4eb13f7~1 a1265119164b79cfb12d28a7059d453fb4eb13f7 

我的.git /配置是:

[core] 
    repositoryformatversion = 0 
    filemode = true 
    bare = false 
    logallrefupdates = true 
    autocrlf = false 
[svn-remote "svn"] 
    url = http://proj.badc.rl.ac.uk/svn/badc 
    fetch = users/spascoe/metaconfig/trunk:refs/remotes/trunk 
    branches = users/spascoe/metaconfig/branches/*:refs/remotes/* 
    tags = users/spascoe/metaconfig/tags/*:refs/remotes/tags/* 

閒逛在git的是沒有幫助。任何想法出了什麼問題?

+0

究竟是什麼意思,「在幾個標籤之後?」 – lindelof 2010-07-21 13:33:51

+0

即使我重新克隆SVN倉庫,我最終還是會對tags/0.1.1進行提交。 最後,我通過在SVN中進行虛擬提交來解決了這個問題,使用git進行recloning,然後將從1 git回購庫中的待處理更改合併到另一個。我不回覆svn主幹。 我還想知道這個混亂是怎麼發生的:-) – spascoe 2010-07-21 15:21:17

+0

@lindelof。說實話我不記得了。我想我嘗試了「git tag」,發現它對svn沒有任何幫助。然後我找到了「svn tag」,然後發現我可以使用「git svn tag」。 – spascoe 2010-07-21 15:22:41

回答

2

git svn命令有一個錯誤,當初始導入svn倉庫時,master分支可能指向svn trunk以外的其他東西。它在git v1.6.5和更高版本中被修復(如果你有git簽出,則在v1.6.5-rc0~75中)。

如果你已經完成了檢查svn倉庫,並且想要確保主分支指向svn trunk,請執行以下操作。

注意:這些說明假定您已提交或隱藏您所做的任何本地更改。使用git stash save保存所有未提交的作品,並使用git branch newbranchname創建一個分支到您的上次提交。

  1. 切換到使用git checkout master,如果你不是已經有主分支。使用git branch來查看您當前的分支,它旁邊有一個星號('*')。

  2. 運行git svn info並檢查「URL:」字段。如果URL指向主幹,那麼你就完成了。下一個git svn dcommit將提交到主分支的中繼。

  3. 如果git svn info指向一個標籤或分支URL,運行git log,並找到第一次提交的是有一個指向您的SVN主幹網址爲「git-svn-id:」 URL。複製表示此提交的40個字符的提交散列(以「commit」開頭的行)。

  4. 重置您的主分支使用git reset --hard commit-hash提交哈希取代「commit-hash」與提交哈希從第3步

    注:這一步是最危險的一個!確保你保存了所有的工作!根據需要製作工作目錄的tarball。

  5. 再次運行git svn info以確保「URL:」字段顯示您在中繼線上。如果沒有,則在步驟3中複製錯誤的提交散列值。轉到步驟3並重試。

  6. 運行git svn rebase將您的主分支更新到您的svn存儲庫中trunk的最新版本。

專業提示:專家會注意到,你可以在每一個底部,解析「git-svn-id:」行提交日誌,以確定是否一個特定的提交是主幹,在標籤上或分公司。因此,使用git log master來檢查主分支上的第一次提交是否指向svn存儲庫的主幹URL就足夠了。