2013-12-07 51 views
3

我正在做一個本地git倉庫的備份腳本。 我查看了可能性,並選擇了捆綁來完成任務。 我所採取的步驟:Git包添加遠程

  1. 創建一個新的回購,做初步承諾

    當我git branch -a檢查回購我得到以下幾點: * master

  2. git bundle create ./test.bundle --all

現在,當我用檢查捆綁包時 我得到了2個參考文獻:1個用於HEAD,另一個用於refs/heads/master。

當我拉這個包與git clone一個新的存儲庫,樹枝是這樣的:

*master 
remotes/origin/HEAD -> remotes/origin/master 
remotes/origin/master 

爲什麼會出現這種情況?有沒有辦法只導入第一個倉庫裏沒有遙控器的分支?

編輯:

我的問題可能有點不清楚。這裏是我想達到的:

  1. 有2個分支,主人和測試回購。
  2. 束各分支機構(含git bundle --branches所做的建議)
  3. rm整個回購
  4. 恢復使用Git克隆回購。不幸的是我必須給一個分支參數,因爲我碰到下面的錯誤,沒有它: warning: remote HEAD refers to nonexistent ref, unable to checkout.

即產生唯一的問題是,我得到克隆後如下分支:

*master 
remotes/origin/master 
remotes/origin/test 

在切換到測試,我收到一條消息,說明一個新的分支已經完成。有沒有辦法克隆所有分支,以便它看起來像原始回購?

*master 
test 
+0

任何理由downvote? –

回答

1

從包中克隆時,包中的分支將看起來像您的克隆中的遠程存儲。這很正常。

儘管git bundle list-heads顯示了原始存儲庫的遠程引用,但您不會在新克隆中看到它們。我的意思是比如:

$ git bundle list-heads test.bundle 
a742ee94e8fcef80eb5619f76674bb79d7011742 refs/heads/test2 
a8bf0cf603a686ccb75179c64b3392d50ff2f4af refs/heads/master 
a8bf0cf603a686ccb75179c64b3392d50ff2f4af refs/remotes/origin/HEAD 
a8bf0cf603a686ccb75179c64b3392d50ff2f4af refs/remotes/origin/master 
a8bf0cf603a686ccb75179c64b3392d50ff2f4af refs/remotes/origin/test1 
a8bf0cf603a686ccb75179c64b3392d50ff2f4af HEAD 

然後從這個克隆:

$ git clone test.bundle clone2 
$ cd clone2 
$ git branch -a 
* master 
    remotes/origin/HEAD -> origin/master 
    remotes/origin/master 
    remotes/origin/test2 

也就是說,沒有原來的遙控器,其test1分支的跡象。

可以創建一個包沒有這樣的遠程引用:

$ git bundle create test.bundle --branches HEAD 

但我不知道這會帶來很大的區別。雖然我從來沒有使用捆綁工作,所以也許這個答案可以改進。

UPDATE

當你從包克隆,捆被看作是一個遙控器,新的原點,從你的新克隆點。克隆時,僅爲HEAD創建本地分支,其他分支留在原點。如果你想完全擺脫捆綁,你可以創建在束各分支機構的遠程(=原點)地方分支機構,然後刪除遠程刪除捆綁,像這樣的東西:

for b in $(git branch -r | grep -v HEAD | cut -f2 -d/); do 
    git show-ref --verify --quiet refs/heads/$b || git checkout $b 
done 

在運行此操作之前,請確保您處於乾淨狀態,且沒有掛起或分階段更改。

+0

但不是 - 分支HEAD只是將頭部存儲在捆綁中?我想將所有分支存儲在捆綁中。 –

+0

'--branches'會添加所有的'refs/heads/*',所以所有的分支。這聽起來像你想做的事情。你試過了嗎? – janos

+0

現在會嘗試它 –

1

我設法找到答案。這是我做的:

正如janos建議的那樣,我對所有分支進行了捆綁。 在生成的包上創建了一個git克隆。現在爲每個參考,我檢查了分支,並刪除了遠程分支。

最後我刪除了遠程HEAD參考。

我發現這個問題非常有用: How to clone all remote branches in Git?

+0

看來你忽略了我給你的命令中的HEAD參數:'git bundle create test.bundle --branches HEAD'。它在那裏,所以你沒有得到你在更新中提到的警告。我還用腳本更新了我的帖子,以檢查所有遠程分支。 upvote和接受會很好... – janos