2011-04-21 60 views
2

是否可以確定我可以安全地從新的遠程倉庫中提取,即兩個倉庫共享一個共同的祖先?我正在編寫一個程序,可以自動克隆和更新大量的git,hg等存儲庫,並且我想無縫地處理遠程存儲庫移動到新URL的情況。看來,git將允許我從任何遠程拉,可能會產生巨大的衝突。 Svn擁有存儲庫uuid來確定您是否可以切換到新的url。我意識到git是分佈式的,並且意味着可以輕鬆分叉,所以uuid並沒有什麼意義,但是git中有沒有類似的功能?如何確定遠程git倉庫是否「安全」從

回答

3

您可以將add and fetch the remote branch存儲到您的存儲庫中,而無需將其合併到您的歷史記錄中。然後,您可以測試一下,看看是否有使用git merge-base

git remote add test-remote [email protected]:/path/to/repo.git 
git remote update 
git merge-base test-remote/master master || echo "No common ancestors!" 
+0

謝謝!看起來我需要更多地檢查「低級別」git命令:) – 2011-04-23 19:09:06

0

git中的「pull」僅僅是一個「獲取」,然後是「合併」到當前分支。當你這樣做,有沒有共享祖先遠程的Git「取」,你會得到這樣的警告:

警告:沒有共同的承諾

你應該能夠做到從URL中提取,然後檢測這個來自該操作輸出的消息。

+1

此消息是否是獲取不相關歷史記錄的可靠指示器很大程度上取決於確切的使用情況。特別是,該消息不會出現重複獲取相同的不相關歷史記錄(除非本地存儲庫在提取之間被「清除」)。由於遠程追蹤分支的頭部在獲取期間將使用「有/無」協商,所以在通過定義的遠程獲取(即,獲取遠程追蹤分支而不是僅追入FETCH_HEAD)時,尤其如此。 – 2011-04-21 03:27:55

1

我認識了Git是分佈式的,意思是容易forkable,所以UUID並沒有真正意義上的共同祖先,但沒有任何可比性功能/功能在Git?

相反,git作爲分佈式版本控制系統非常有用的部分原因是,每個提交都有一個唯一定義該提交及其完整歷史的ID。 (這些是您看到的與git中的提交相關聯的哈希值,正確地稱爲「對象名稱」。)提交已被提取或推送到哪個存儲庫並不重要,它仍表示與樹完全相同的狀態以及完全相同的歷史記錄,包括作者身份等。

從你的問題來看,我不太清楚你是否想知道(a)是否有任何共同祖先或(b)是否有歷史記錄分支A完全包含分支B的歷史(即,將A合併成B將是「快進」)。

如果您在(a)之後,那麼Brian Campbell's answer就是您想要的,即基本上測試git merge-base test-remote/master master是否成功返回。另一方面,如果你在(b)之後,那麼你應該測試git merge-base test-remote/master master的輸出是否與git rev-parse --verify master相同。

+0

我想我可能想堅持(a),因爲用戶可能已經修改了本地回購協議,以避免快速轉發可能,但感謝您的詳細解釋! – 2011-04-23 19:08:04