2017-08-28 242 views
4

我想反映一個本地資源庫與所有可用的refs包括refs/notes/*'混帳克隆後失蹤。但是,這些便箋沒有按預期克隆。的Git筆記--mirror`

重現該問題在一個空的目錄執行這些命令:

$ git init repo && cd repo 
$ git commit --allow-empty -m 'initial commit' 
$ git notes add -m 'Initial commit on empty repo' HEAD 
$ git clone --mirror .git ../mirror 

獲得裁判之間的差異表明,notes從鏡像存儲庫丟失:

$ diff repo/.git/refs mirror/refs 
Common subdirectories: repo/.git/refs/heads and mirror/refs/heads 
Common subdirectories: repo/.git/refs/tags and mirror/refs/tags 
Only in repo/.git/refs: notes 

git -C mirror fetch不即使在mirror/config中指定了fetch = +refs/*:refs/*,也可以獲取備註。現在

的問題是:有什麼我失蹤?我正在使用git 2.3.0

回答

5

git clonegit fetch獲得引用時,他們通常會將它們「封裝」。

未打包的參考文件根據其全名存儲在.git/refs/中,每個文件一個,因此您可以獲得.git/refs/heads/master.git/refs/notes/commits

盒裝引用(目前)的所有存儲在一個文件中,.git/packed-refs。這包含每行一個引用,加上一些額外的「去皮」變體,用於某些引用(真正的帶註釋的標籤)。

如果引用出現在這兩個地方,Git的「喜歡」解包一個(所以它沒有更新的參考時,從壓縮文件中刪除條目)。一般更新參考拆包:這是更好的和/或更容易保持更新單次入境文件中像.git/refs/heads/master比保持替換多入口文件一行。

Git允許隨時解包或重新包裝引用,所以只需diff兩棵.git樹不保證對你有任何好處。 (對於打包和解壓縮的對象也是如此,但是我看到你只是在refs子目錄中。)所以你引用的diff輸出沒有說明是否克隆了這些註釋。要查看這些筆記是否被克隆,請進入克隆並使用讀取筆記的操作。

無論如何,如果有fetch = +refs/*:refs/*一行,你應該應該得到複製的筆記。

+0

'的.git /填充refs'在這裏缺少的環節。這個答案中最重要的是你不應該依賴git的文件結構,這就是爲什麼我的diff命令沒有意義。而應該使用管道命令,例如'git for-each-ref'。 –