2010-05-04 94 views
2

這裏是我的設置...GIT克隆多臺計算機上

筆記本電腦(Mac) - 屏幕SVN倉庫

優盤混帳克隆 - 筆記本電腦的Git倉庫的混帳克隆

服務器(贏服務器08 ) - 拇指驅動器存儲庫的git的克隆

我無法讓他們在同步出於某種原因...

如果我讓服務器上的變化,我會做拇指驅動器上的「git pull」以獲取更改。把拇指驅動器放到筆記本電腦上,然後在筆記本電腦上「拉動」。從那裏,我可以做「git svn dcommit」,一切順利到SVN回購沒有問題。

如果我通過「git svn rebase」從SVN中獲取更改,然後拉到拇指驅動器上並執行「git status」,它表示我在主/來源之前##修訂,我可以不知道爲什麼。

服務器

>git remote show 
origin 

>git remote show origin 
* remote origin 
    Fetch URL: E:/proj 
    Push URL: E:/proj 
    HEAD branch: master 
    Remote branch: 
    master tracked 
    Local ref configured for 'git push': 
    master pushes to master (local out of date) 

筆記本

>git remote show 
(nothing) 

>git remote show origin 
fatal: 'origin' does not appear to be a git repository 
fatal: The remote end hung up unexpectedly 

拇指驅動器

>git remote show 
origin 

>git remote show origin 
* remote origin 
    Fetch URL: /Users/me/ui/proj 
    Push URL: /Users/me/ui/proj 
    HEAD branch: (unknown) 
    Remote branch: 
    master tracked 
    Local branch configured for 'git pull': 
    master merges with remote master 
    Local ref configured for 'git push': 
    master pushes to master (up to date) 
+0

你可能會添加'git remote show'的輸出,特別是'git remote show origin'嗎?這可能會更容易找出你的設置如何工作。謝謝! (哦,對於每個回購當然,忘了那。:-D) – 2010-05-04 17:22:43

+0

上面添加的信息... – Adam 2010-05-04 17:40:12

+0

這些是用git-svn創建的倉庫,哪些是這些倉庫的克隆? – 2010-05-05 23:32:30

回答

5

像拉的Git命令實際上並不適用rebase。

假設您的筆記本電腦上有一些不在svn中的提交,並且拇指驅動器同步。這樣的事情:

laptop: 
svn1 -- svn2 -- A -- B -- C -- D 

thumb drive: 
svn1 -- svn2 -- A -- B -- C -- D 

然後,你做git svn rebase從svn獲取新的東西。這工作分兩個步驟:

現在我們必須把新的svn的頂部使用Git的工作承諾,所以我們仍然有非支歷史。這是底墊部分:

laptop (after git svn rebase) 
svn1 -- svn2 -- svn3 -- svn4 -- A' -- B' -- C' -- D' 

現在,如果沒有衝突,犯了」包含了同樣的變化老犯,唯一不同的就是它的祖先:SVN4代替svn2。由於歷史是git中每次提交的一部分,因爲git A和A'是不同的提交。

所以,如果你的筆記本電腦回購做git pull拇指驅動器回購後,混帳做什麼是很自然的吧,這是合併新的變化:

thumb drive (after git pull) 
svn1 -- svn2 -- svn3 -- svn4 -- A' -- B' -- C' -- D' 
      \           \ 
      + A -- B -- C -- D -------------------- merged result 

這使得git的完整意義上的,因爲它允許它跟蹤非線性環境中的所有變化,並注意誰合併以及如何進行合併。但是,你將無法將這種歷史提交給svn。

如果強制推更改您的拇指回購,你最終的東西是這樣的:

thumb drive (after forced push) 
svn1 -- svn2 -- svn3 -- svn4 -- A' -- B' -- C' -- D' 

,如果你還沒有做的拇指驅動器回購任何變化,這是完全沒問題。如果你這樣做,這會覆蓋他們。爲了保持拇指驅動器的變化,你必須在那裏再做一次git rebase

我想說,要充分利用git的舒適性,你必須放棄將工作交給svn的能力。有沒有簡單的方法來同時分佈式版本控制和線性歷史。

+0

這是很多非常好的信息!因此,不會直接在拇指驅動器上進行更改。它僅用作服務器和筆記本電腦的中介。我們只需要偶爾執行此操作,因爲我們現在只需部署到服務器。 有沒有辦法使這項工作?我們希望能夠從服務器(在集成過程中)維護更改歷史記錄,然後能夠將服務器快速更新到最新,最好的狀態。 – Adam 2010-05-04 17:45:55

+0

非常好的例證,正是我在想什麼。 – dlamotte 2010-05-04 18:19:12

+0

@Adam:如果你將所有這些部署到服務器上,IMO最好的辦法是在拇指驅動器上設置'remote。(name).fetch'選項來鏡像筆記本電腦回購(我認爲設置是'+ refs/heads/*:refs/heads/*'),並使用拇指驅動器在服務器上執行相同操作。所有你需要做的就是在服務器上運行'git fetch(laptop)',並在服務器上運行'git fetch(thumb)&&git checkout -f(my_chosen_branch)'。 (請注意,這將覆蓋拇指和服務器倉庫上的所有本地更改。) – che 2010-05-05 22:55:06

0

這是因爲git svn rebase代碼變基庫中所有的提交。如果任何git提交你沒有提交到上游repo,commit id將會改變,你的其他倉庫將不會看到這個改變。這是我現在最好的猜測。你的工作流程對我來說有點困惑。一個ascii圖可能會有所幫助,但這將有點工作;)

在我看來,最好的方法可能是git push -f ...git svn rebase後你的拇指驅動器。基本上,強行更新拇指驅動器。但說實話,我不是一個混帳大師。

+0

這很有道理......我如何防止/修復這個問題? – Adam 2010-05-04 16:54:22

+1

不幸的是,請參閱git-svn聯機幫助頁中的CAVEATS部分。不建議使用git-svn存儲庫進行克隆,推送和拉取。 我有一個問題要等待Subversion,git或其他DVCS需要做什麼,以便它們真正可以互操作。 – 2010-05-05 23:31:34