2013-01-17 125 views
5

這是場景。我有兩臺機器,「桌面」和「筆記本電腦」。如何讓兩個git存儲庫保持同步?

在桌面上我做的:

mkdir git_test 
cd git_test 
git init 
dd if=/dev/urandom of=test.img bs=1k count=1000 
git add test.img 
git commit -m "Added first image" 

然後在筆記本電腦,我做的事:

git clone [USER]@desktop:/home/[USER]/git_test  
cd git_test 
dd if=/dev/urandom of=test2.img bs=1k count=1000 
git add test2.img 
git commit -m "Added second image" 

然後我想我的桌面上的混帳回購協議看起來像我的筆記本電腦的混帳回購協議。在筆記本電腦上,我發出以下命令: 混帳推起源主

但後來我得到:

remote: error: refusing to update checked out branch: refs/heads/master 
remote: error: By default, updating the current branch in a non-bare repository 
remote: error: is denied, because it will make the index and work tree inconsistent 
remote: error: with what you pushed, and will require 'git reset --hard' to match 
remote: error: the work tree to HEAD. 
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to 
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into 
remote: error: its current branch; however, this is not recommended unless you 
remote: error: arranged to update its work tree to match what you pushed in some 
remote: error: other way. 
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set 
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'. 

如何保持這兩個回購同步?

錯誤消息似乎暗示git有我想要的功能,但出於某種原因,它似乎是一個更高級的工作流程。我聽到有人曾經說過,你不能推到你現在所在的分支,有人能說這是一個可能的解決方案嗎?我對這種性質的解決方案沒有任何問題,例如,我可以在我的筆記本電腦上的某個分支上工作,並在我的桌面上處理另一個分支上的問題,然後以某種方式同步它們,使它們完全相同。

請注意以下事項!

  • 我不想使用集中式回購,像github上,有幾個原因。首先是安全。第二個是簡單。第三是由於情況我不會進入這裏,我不能指望有一個互聯網連接到一些遠程服務器,我只有我的兩臺機器通過局域網連接。最後,我想學習如何按照我在這裏所要求的方式來做事,以獲得特定的知識。

  • 我也不想使用裸回購,因爲裸回購在根目錄中有一堆垃圾。這是醜陋和混亂。我從顛覆轉向git的全部原因是,git看起來像是一個更清潔,分散的解決方案。另外,我還有一些非技術人員會在桌面的根目錄中工作,他們會被這個問題困惑不解。 git的美妙之處在於(我認爲)所有東西隱藏在.git文件夾中。編輯:顯然,我不清楚這一點。想象一下,我有一個「Documents」文件夾,其中包含以下子文件夾:mydata1和mydata2。這不是一個人爲的例子,這正是我想要處理的問題。 mydata1應該包含「test.img」,只有這個文件,而是它現在有:

    分支 配置 描述 HEAD 鉤 信息 對象 裁判

我希望能夠只需cd到mydata1並開始編輯文件,但是我必須嘗試通過分支機構cd,或者甚至只是爲了完成工作。並且對於這種類型的目錄結構,每個子文件夾在「文檔」中是不可行的。請不要告訴我這樣做。請回答這個問題。謝謝。

這兩點是整個原因我在這裏發佈這個問題。請只回答如果你有這個問題的答案。 :) 謝謝!!

+0

我指的是「cruft」,如下所示:「分支配置說明HEAD掛鉤信息對象引用」我只想/ home/[User]/git_repo只包含我正在使用的文件。另外:.git文件夾被隱藏。 –

+0

您可以隱藏回購。 – nobar

回答

10

這樣做的一種方法是拉,而不是推。在第一臺機器上安裝完兩臺機器之後:

git remote add origin [USER]@laptop:/home/[USER]/git_test 
git pull # Complains about untracked branch while adding the branch you want to track 
git branch --set-upstream master origin/master 
git pull 

現在您可以從任一機器提交提交。如果你想推動,我不知道如何去分散設置。

+0

拉絕對適用於我的工作流程,只要我不必處理裸回購或集中回購。感謝您的澄清。我會測試這個工作流程並回報。謝謝! –

+1

如果機器甚至是輕微的物理分離,一種可能性不大 - 創建一個類似於別名的bash別名git_push =「ssh remotemachine'cd git_test; git pull'」' – cjc343

+0

這絕對是一種可行的方式。考慮這兩個回購是屬於你還是其他人。你不會希望那個人把他的東西扔進你的倉庫,他不希望你把你的東西扔進他的倉庫。對於推動這項新工作的另一個故事,可能在另一個分支上,而不是推動它。 –

2

我可能會錯過爲什麼你不想使用裸回購,我相信拉唯一的解決方案應該可以正常工作,但我也相信,「cruft」仍然可以隱藏在你工作時的願望與光禿禿的回購。

在桌面上,如果您:

mkdir git_test 
git init --bare git_test 

然後:

git clone bare_repo_directory new_location 

可以推及一般拉至裸露的回購協議(引用它作爲默認原點)從克隆,沒有人會需要處理它包含的額外內容;克隆將只有.git目錄。

推你需要運行:

git push origin master (assuming you're working out of master) 

爲您的筆記本電腦:

git clone [USER]@desktop:path_to_bare 

和工作應該是在克隆副本正常。您將從原點(這是裸回購)進行推拉,但您不需要直接在其中工作。

1

推送不起作用的原因正是您提到的。默認情況下,如果該存儲庫(接收推送的遠程)當前工作空間指向同一分支,則無法推送至佈告。所以如果你的遙控器有master目前已經結帳,你將無法推送到master

兩個快速的解決方案:

如果您已經在回購任何承諾,只是直接結帳的哈希,這將讓你在一個無頭的狀態,這意味着你是不是在任何一間分行:

> git checkout <any-hash> 
Note: checking out '<any-hash>'. 

You are in 'detached HEAD' state... 

了一個全新的回購另一種方式,如果你想推到master,只是到最初的分支更改爲其他未命名master

> git symbolic-ref HEAD refs/heads/non-existent 

這會使您處於與master類似的狀態,在新的存儲庫中,在沒有提交提交的分支中。只是你不會抓住主人,因此它將被允許接受推動。

1

我最近有一個問題,我的服務器和桌面不同步。在網上搜索了一段時間後,我無法找到解決我的確切情況的答案。所以我給Rackspace提供了支持,他們能夠爲我提供我認爲比我在網上找到的更好的答案。

這個特定的線程是最接近我的問題,所以我想我會分享我如何解決這裏的問題,以防將來遇到同樣的問題。

這裏是什麼地方出了錯

我試圖安裝Magento的甜食插件,並隨後與通常的步驟中,我們都經歷過安裝Magento的擴展一起。這意味着將一堆文件放入我的App,JS和Skin目錄中。

在app/design/adminhtml目錄中有一個「base」文件夾。如果你知道Magento的任何信息,那麼你知道他們有關於基礎文件的混亂的數十萬條警告。總之 - 不要這樣做。

我認爲,因爲我的本地回購沒有「基本」目錄,我會把它放在我的本地機器上。不幸的是,令我沮喪的是,這意味着當我做了我的添加它添加了一個「基本」目錄,只有Sweet Tooth的文件。當我把它放在服務器上時,它將我的整個基本目錄和Boom摧毀了!下去了Magento。

幸運的是,我能夠通過使用下面的救生命令,回到以前的服務器狀態:

的git的復位 - 硬頭@ {1}

這個命令,你回到以前的提交,並立即一切恢復正常。當然,現在我的服務器和桌面不同步,因爲我的服務器現在已經落後了一次。

添加侮辱傷害我犯了一個非常愚蠢的錯誤,並從我的電腦中刪除擴展名的文件,並做了我的桌面上的另一個提交,所以現在服務器和桌面不同步的兩個提交和git現在有這些文件在其緩存中。

這裏是我如何解決它

顯然,這讓你在一個非常惱人的地方,因爲這樣做我的服務器上的git拉將塗掉,每一次我的「基地」目錄。另外,由於它提前兩次提交,我不能只回滾一次提交。

我叫Rackspace,在這一點上,他是我心目中的上帝,並且發現了兩種不同的方法來解決這個問題,這取決於您是要從服務器端還是桌面端執行此操作。

事實證明,你真的不能從服務器端做到這一點,因爲文件現在不再在桌面上。雖然他們建議做一個git commit -a,然後從服務器上進行推送,然後從桌面上拉出來,但這種方式不起作用,這些文件不再在桌面上。

因此,您必須從桌面修復它,並且您需要從緩存中獲取這些補丁文件。

修復同步問題從桌面

要獲得這些文件從緩存中我發出以下命令過來,過來,一遍又一遍,直到進行了刪除,我已刪除的文件根據混帳。

的git RM -r --cached /文件夾/目錄目錄

的git RM --cached /文件夾/文件的文件

現在這是超出緩存我能夠做一個提交,並最終讓git知道這些文件實際上已經消失。

然後推送給主人。然後,所有剩下要做的事情就是從服務器和中提琴拉回來,重新開始!

**結論和經驗教訓**

的教訓這裏是一些大的,我寫這篇文章對於有類似問題的其他程序員以及自己提醒我什麼不該再次做。

  1. 如果你沒有在你的本地回購的文件夾是在服務器上,不要把它與它只有幾個文件添加到您的本地回購,這將在零出目錄服務器。

  2. 如果你不小心搞砸,請務必使用Git刪除文件,不要從您的本地文件系統刪除

  3. 混帳休息--hard HEAD @ {1}是你最好的朋友有時

我希望這可以幫助其他任何處於類似情況的人。我花了幾個小時在網上查看文檔,但找不到任何與我遇到的複雜問題有關的任何內容,如果我可以幫助其他人節省一些時間並減少一些灰色頭髮,那麼我的噩夢將爲世界帶來一些好處!