2012-11-02 71 views
2

我有一個情況,我有兩個存儲庫歷史已被複制和損壞(通過SVN的交互和遷移 - 不是我的選擇)。我在同一個臨時維護庫中都有作爲遠程存儲庫的存儲庫。他們分享了幾百次歷史價值的承諾,然後這個「舊」的承諾在幾個分支上繼續增加幾十次。我需要將「新」樹快速轉向舊的狀態。然而,由於內容相同,儘管內容相同,但它們不被識別爲同一棵樹。git可以自動識別相同的提交(使用不同的哈希)

我想告訴git「這兩個提交是相同的,儘管有不同的作者」(作者ID在翻譯中混淆了)。如果可能的話,那麼我真的很喜歡它是否可以遍歷兩個遠程樹,併爲每個節點使用相同的內容進行關聯。這意味着我可以手動在兩者上標記「提交1」,並讓其完成。否則,我將需要手動標記每個分歧的根源(不會太糟糕,但寧願不要)。我嘗試使用移植點,這幾乎是我想要的 - gitk顯示我想要的,但是當我將它推回到主(新)存儲庫時,它沿着幾百個重複提交進行拖動。這也有點令人討厭,因爲我必須爲尚未合併的子節點做這件事。

我發現https://stackoverflow.com/a/973403/372757,並認爲它會工作:我只需要將舊提交重新綁定到新的存儲庫,每個分支一次。

無論如何,我仍然想知道我的原始請求是否可能。

+1

如果您希望能夠推送該信息並將其用於遠程回購,則需要'git replace'而不是'grafts'。 –

回答

3

git對什麼是「相同的提交」會有一個非常嚴格的定義,可能與您的想法不符。爲了相同的承諾,以下所有必須爲真:

  1. 樹中的每個文件將被提交必須是字節爲字節等同於同一個文件中的承諾,將成爲母公司(即當前的HEAD)
  2. 沒有新文件,沒有刪除文件,沒有重組 - 樹必須完全匹配,因爲樹的SHA1取決於它所包含的文件和子樹;如果在樹中的所有葉子不同的是,頂層樹的SHA1會有所不同
  3. 一模一樣的作者和提交者的姓名和電子郵件值
  4. 一模一樣的作者和提交日期
  5. 一模一樣的電流HEAD的價值,這將成爲新的父提交
  6. 完全相同的提交信息
  7. 我失蹤

所有這些事情可能是一些其他的細節都直接或間接地用於爲新提交生成SHA1哈希,因此提交將不會完全相同,除非它完全相同。

這就是說,我認爲可能更重要的是,在生成新提交時,如果特定文件或樹與數據庫中已存在的對象的字節對於字節相同,因爲另一個提交使這些事情處於完全相同的狀態,那麼新提交將指向那些已經存在的對象 - 它們不會再被存儲。

如果只有作者信息在兩個分支上不同(即不同的提交順序,即使文件內容完全與另一個分支匹配),也可以使用git filter-branchgit rebase來重寫分支,修復信息但是這會導致一組全新的提交(但是假設除了提交消息,時間或作者/提交者名稱以外,所有樹和文件對象都可以保持不變)。但請注意,如果其他工作(由您自己或其他人)已經建立在現有分支之外,則可能需要進行大量的清理工作才能進行此類更改。

+0

是的,我想我應該說這個有點不同 - 我知道那些要求,我想知道我是否可以「建議」它忽略3和4.我會給過濾器分支嘗試看看是否會做到這一點。 – zebediah49

1

你的問題是重新定義提交相等。我認爲你應該使用git cat-filegrep來過濾提交的相關信息。也許樹線對於你來說已經足夠了(比如git cat-file commit <COMMIT_ID> | grep "tree"),但是我認爲也可以包含父樹(不僅僅是提交的ID,因爲它們會有所不同)。

一旦你有這個平等的功能,這將是git rev-list回購的問題,並做一些重複搜索他們,我認爲。

相關問題