2010-07-26 106 views
42

我是一名獨立開發人員,在本地Git存儲庫中工作。對於備份,我想將該存儲庫的確切副本發送到另一臺服務器。「git push --mirror」足以備份我的存儲庫嗎?

這樣做足夠嗎?

git push --mirror 

我這麼問是因爲我有時可以運行此命令兩次或三次Git的告訴我:「一切了最新的」過,所以很明顯它不是一個確切的鏡子。這似乎是重新推動追蹤分行......?

$ git push --mirror 
Counting objects: 42, done. 
Delta compression using up to 8 threads. 
Compressing objects: 100% (30/30), done. 
Writing objects: 100% (30/30), 5.09 KiB, done. 
Total 30 (delta 17), reused 0 (delta 0) 
To ssh://my/repo/url 
    c094a10..0eedc92 mybranch -> mybranch 
$ git push --mirror 
Total 0 (delta 0), reused 0 (delta 0) 
To ssh://my/repo/url 
    c094a10..0eedc92 origin/mybranch -> origin/mybranch 
$ git push --mirror 
Everything up-to-date 

發生了什麼,這是一個很好的策略嗎?

編輯:我不喜歡使用類似git bundle.tar.bz2檔案,因爲我希望備份是一個可訪問的工作副本。由於我的備份服務器連接到網絡並始終打開,因此在路上時,這是訪問存儲庫的好方法。

+2

參見:[備份本地Git倉庫(http://stackoverflow.com/questions/2129214/backup-a-local-git-repository) – miku 2010-07-26 08:24:24

+0

這是否備份引用日誌以及?如果沒有,那麼這是一個很差的備份。 – onionjake 2014-04-07 21:52:21

回答

6

我會說這是一個完全可以接受的備份策略。它應該對存儲庫中的每個參考文件執行一次遠程啓動。使其成爲本地存儲庫的完整「鏡像」。

編輯:我剛剛看到你的更新說明的問題。看起來git正在將您的遠程引用與其他所有內容一起推送到遠程本身。一旦完成推送,遠程參考將被更新,以反映你剛剛推送到它。現在這將與遠程存儲庫過時,因此需要進一步推進。如果這不能讓你滿意。你可以用

混帳推刪除遠程參考:產地/ mybranch

然後用

混帳推--all

記得這韓元」 t推動你創建的任何新分支。

+0

那麼爲什麼當我第二次運行它時會做些什麼? – Thomas 2010-07-26 11:28:28

+0

你是什麼意思的'東西'?您正在推送到裸露克隆的存儲庫?你可以提供更多的細節,因爲我確定git push --mirror應該提供你正在尋找的功能。 – 2010-07-26 18:23:21

+5

另外值得一提的是使用--mirror選項克隆存儲庫,然後使用'git remote add --mirror '。這將自動鏡像,所以你應該能夠運行'git push'。 – 2010-07-26 18:32:22

0

爲什麼不直接壓縮.git文件夾的副本並將其發送到另一臺服務器?

+0

看我的編輯。 :) – Thomas 2010-07-26 09:04:26

3

我通常使用git push --all。當我需要推新創建的分支時,我只使用--mirror,或者我刪除了一些分支,並且不想一個一個地命名它們。否則,push --all通常會按需要工作。

28

你第二次看到某些東西的原因是--mirror推得比你想象的要多一點。除了您當地的分支機構之外,它還會推動您的遠程分支機構,因爲鏡像暗示的一切都是。因此,當您正常推送(或使用--mirror)時,會推送mybranch,並更新origin/mybranch以反映原始狀態的新狀態。當你推--mirror時,origin/mybranch也被推。

這會導致您看到的陌生感,並且在您從遙控器拉出時會產生更糟糕的陌生感;你會得到名稱爲origin/origin/mybranch等的分支。因此,通常最好使用--mirror一次性副本,並且只需使用正常推送(可能與--all)即可正常使用。

要始終推動所有分支和標籤,你可以像這樣更新.git/config

[remote "origin"] 
    url = ... 
    fetch = ... 
    push = +refs/heads/* 
    push = +refs/tags/* 

這將使類似鏡子的正常推進,但它不會刪除不存在的分支在源或非快進更新。

+0

謝謝,很高興知道。我記得在某個時候看過這些'origin/origin/*'分支,但顯然我刪除了它們。 '--all'的問題是它不會推送任何新的分支,也不會刪除任何刪除的分支。這不足以防萬無一失,有時候我可以成爲一個傻瓜。沒有辦法告訴'--mirror'忽略遠程分支? – Thomas 2010-07-27 11:20:37

+0

我不認爲有辦法讓它忽略遙控器。但是,您可以修改'.git/config'以按默認值推送更多內容。我已經更新了答案。 – 2010-07-27 12:09:06

19

不幸的是,你沒有得到與推的確切副本。你lose your stash

+3

謝謝,很高興知道。然而,這並不重要,因爲無論如何這個藏匿處應該是一個非常短暫的事情。 – Thomas 2010-07-27 11:15:24

+2

是的,我認爲它足夠備份,但不適合同步。 另外,我們都知道我們有時候依賴短期的東西多久。 ;) – nschum 2010-07-27 18:36:32

+4

如果你保留任意時間的存儲空間,也許你需要更舒適的製作分支(: – Jacob 2012-04-23 00:20:17

3

我要做的就是:

設置回購:​​

然後,當你想刷新備份:從克隆位置git remote update

這將備份所有分支,包括後來添加的新分支,但值得注意的是,刪除的分支不會從克隆中刪除(對於備份而言,這可能是件好事)。

http://www.garron.me/en/bits/backup-git-bare-repo.html