2012-09-24 18 views
3

我有一箇舊的SVN存儲庫,我使用git-svn檢出,以便使用並推送到Heroku。我正在做一個非常標準的git push heroku master,git svn rebase,git svn dcommit跳舞和事情都很好。git-svn-id從某些提交中丟失

不過,最近我一直在做一些公平的git工作,並且在一段時間內還沒有做過git svn rebase。現在,當我嘗試進行重新分配時,由於合併衝突而失敗,儘管我是唯一承諾進行回購並且僅在主人工作的人。

指出它可能是工作副本,這是問題我做了一個新的git svn clone,然後git remote add herokugit pull heroku master。拉沒有問題快進合併,但git svn rebase仍然失敗。

我做了一個簡單的git log,我看到,我有一些舊的提交缺少git-svn-id S:

commit def8bab861314c67d4e8227e03775d19045d21d1 
Author: peterr 
Date: Fri Sep 21 16:17:33 2012 +0000 

    PHP Cedar support. 

    git-svn-id: http://vcp.unfuddle.com/svn/[email protected] b6b24ac3-8b7a-4c11-a811-49c5d0334e85 

commit f51bd78fb07dde6ec1dc4e0ba51a48f2b6bd1bd6 
Author: pr1001 
Date: Mon Aug 20 19:39:42 2012 +0200 

    Specify port correctly 

commit 153bb2929080898dcab46142120def0f4964dfab 

... 

commit 5a416fa3af9f64aa353d5171bedfaa563115ff62 
Author: pr1001 
Date: Mon Aug 20 17:22:58 2012 +0200 

    PHP Cedar support. 

commit e0b35588d03082a3a4ab49a7b590f206346046c0 
Author: j 
Date: Fri Aug 3 08:13:33 2012 +0000 

    change email 

    git-svn-id: http://vcp.unfuddle.com/svn/[email protected] b6b24ac3-8b7a-4c11-a811-49c5d0334e85 

an SO answer據我瞭解,我也許能改寫提交信息來補充缺少的信息,但我想知道這是否會更糟。

看着這些消息,它看起來像我有一些重複的提交,如'PHP雪松支持'之一。我真的很困惑,爲什麼我有這些重複,雖然我懷疑他們可能會被轉發到失敗的git push heroku master我有一天,我被告知存儲庫不同步。 git pull heroku master似乎沒有帶來任何改變並解決了問題,但也許它帶來了重複的提交。

所以,考慮到這一切,我的問題很簡單,我該如何繼續?我在Heroku上有一個可用的應用程序,並且在SVN倉庫中有一個較舊的工作代碼庫,但是我沒有看到任何簡單的方法來清楚地獲得SVN中較新的提交。我應該挑櫻桃嗎?那麼我需要加載Heroku應用程序才能避免重複出現?

回答

4

猜測你是如何進入這種情況並不容易,但我認爲這是因爲推送到SVN時,git-svn用git-svn-id簽名替換(使用rebase或reset)提交,所以有2個範例每個提交:「本地」 - 沒有「git-svn-id」簽名---和遠程簽名。

要恢復:

  1. 創建一個臨時的分支,讓您的當前狀態(某種 備份):git co -b backup
  2. 確保參/遙控器/混帳SVN指向最新與承諾對應於Subversion版本庫的git - svn的-id和有沒有混帳svn的-ID沒有提交由git log refs/remotes/git-svn

所示。如果這是不正確的,你可以使用下面的技巧來修復裁判/ R表情/混帳的svn: 更新參/遙控器/混帳svn涉及到指向最新提交那裏一切正常(在您的情況是對應於R23):

$ git update-ref refs/remotes/git-svn e0b35588d03082a3a4ab49a7b590f206346046c0 

git的設置/ SVN /元數據修訂爲指向修訂:

[svn-remote "svn"] 
     reposRoot = ... 
     uuid = <UUID> 
     branches-maxRev = 23 
     tags-maxRev = 23 

刪除(或更好搬走)文件的.git/SVN /參/遙控器/混帳SVN/.rev_map。UUID 現在運行

$ git svn fetch 

你參/遙控器/混帳svn的參考,現在恢復到最新的有效SVN版本。

3。從Git存儲庫獲取所有更改,不合並

$ git fetch heroku master 

現在所有更改都在ref/remote/heroku/master中。

4。確保你沒有本地的變化(我建議你現在在掌握)。將refs/heads/master重置爲refs/remotes/git-svn。其中一種方法:

$ git update-ref refs/heads/master refs/remotes/git-svn 
$ git reset --hard HEAD 

5。看看refs/remotes/heroku/master和refs/remotes/git-svn。 Git存儲庫中是否存在refs/remotes/git-svn中不存在的更改?如果是的話,櫻桃採摘他們一個接一個。也可以看看你的備份分支(僅在沒有git-svn-id的情況下提交),如果它們不在SVN中,也可以選擇它們。

6。現在,您在master中還有一些不在SVN中的更改。運行

$ git svn dcommit 

將它們推送到SVN。

7。現在您的SVN相關分支已經完全修復並且具有所有更改。如果我理解正確,您需要Git存儲庫中的相同內容。更好地與當前的主內容替換參/遙控器/ Heroku的/主:

$ git push heroku master --force 

現在你的Git倉庫有相同內容SVN倉庫。

在將來避免這些問題,確保您從未推承諾不混帳svn的-ID到Git的(即當您運行「混帳推」你的主人包括提交的僅有的git - svn的-ID signatgures - 如果沒有 - 運行「git svn dcommit」將它們先推送到SVN)。

+1

我有一個完全不同的問題,但這給了我需要關於git-svn來解決它的信息。謝謝! :) –