簡體   English   中英

如何合並兩個存儲庫

[英]How to merge two repositories

我想建立一些堅如磐石的規則,我們可以使用這些規則將我們的多個存儲庫逐步組合到一個存儲庫中。 我之前已經這樣做過,但僅在簡單的情況下。

我的出發點是這篇文章

在我們的案例中,我們已經(演變了)六個左右的存儲庫,幾個月前,我將其中一個合並到一個新的存儲庫中,最終我們希望所有內容都在這個新的存儲庫中而不會丟失歷史記錄。

讓我強調一下,我們談論的是Github中的組織帳戶,所有回購都是私有的,並且都是這些回購的分支。

我所面臨的挑戰-在一般情況下-是其他人分叉了這些存儲庫,並且在分支上可能還存在基本存儲庫中不存在的分支。

因此,如果我僅將一個基礎存儲庫合並到另一個基礎存儲庫中,則原始存儲庫的分支將變得無效,並且它們的內容(僅存在於分支上的提交)將變得無法使用。

而且(該文章未討論)是多個分支的問題,如果(要從中合並的)源存儲庫有多個分支,則在全部說完之后,這些分支必須保留,保留或存在於合並的存儲庫中。

那么在這種一般情況下該如何進行呢? 順便說一下,我們在大多數git工作中都使用Smartgit。

我認為您的某些擔心是基於對git如何組織其信息的誤解。 我仍然同意,制定可靠,可重復的計划將是一個非常好的主意。

首先,首先:您只需對正確的遠程對象執行提取操作就可以收集每個存儲庫中的所有對象,並自動合並重疊部分和所有引用。

git init
git remote add origin
git remote add dept_A_fork
git remote add dept_B_fork
git fetch --all

現在,您有了一個本地倉庫,每個遠程站點的每個分支都在其中。 您有origin/masterdept_A_fork/masterdept_B_fork/master 如果只有dept_B_fork具有feature_XYZ分支,則您具有dept_B_fork/feature_XYZ

這些分支中的每個分支都有完整的歷史記錄。 如果他們共享歷史記錄,那么他們已經在共享所有常見的對象(包括提交)。 如果有人分叉了dept_B_fork ,他們可以將該新存儲庫作為遠程目錄指向,他們將找到他們提供本地分支所根源的上游歷史所需的一切。

從那里您需要約定。 如果所有回購都有分支,您想怎么辦? 將它們合並在一起,使“本地”引用? 你當然可以。 可能涉及很多沖突解決和測試。

只在某些存儲庫中出現的分支呢? 可以只保留遠程引用,但是假設完成后這將是“真正的遠程”,那么我想辦法將所有內容重新映射到本地分支。 因此,也許遠程ref refs/remote/dept_B_fork/custom_branch變成了本地ref refs/heads/dept_B_fork/custom_branch (其中有一些命名空間)。

最重要的規則,因為你擔心你的叉子叉,保證它們有效,是不會變基東西 不要挑櫻桃。 不要使用filter-branch 不要做壁球合並。 不要做任何會移動引用的方式,以使其不再達到以前達到的提交。

(如果您真的知道自己在做什么,但是其中的一些規則可以說是過大了,但是完全遵循它們,就不會有問題。)

這並不意味着沒有人會頭疼。 他們將不得不弄清楚如何將其跟蹤信息映射到新的uber-remote,因為dept-B-forkfork-of-dept-B-fork之間的映射規則將不再正確。 但這還不錯。 至少歷史記錄就在那里,並且您已經將該分支保留在原處(盡管可能使用了新名稱)。 (繞過跟蹤信息的唯一方法btw是,如果您知道總是總是從每個分支中將具有相同名稱的分支合並在一起,以在新存儲庫中創建具有該名稱的分支,而無論你的叉子有那個分支。)

(您可以告訴您是否確實避免了所有麻煩事;如果是這樣,您將能夠在沒有--force / -f選項的情況下將任何分支干凈地推送到任何遠程中的相應分支(如果存在)。)

無論如何,一旦一切都反映在本地分支機構中,您就可以

cd ..
git clone --mirror repo-I-just-made new-origin

創建一個適當的原始倉庫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM