通過 創建新的作業樹時git worktree add foo <revision>,也會在主作業樹.git/worktrees/foo/中創建。我已經多次遇到過這種情況,.git/worktrees/foo1/而是在這種情況下創建。我認為1是附加的,因為存在一些命名沖突。我想知道為什么會發生這種情況以及如何復制該案例。謝謝。
僅供參考,多個執行緒可能在同一個主作業樹中作業以創建不同的作業樹,以及 Ubuntu 上的 git 版本 2.31.1。
uj5u.com熱心網友回復:
該git worktree add代碼使用以下回圈在 中合成作業樹 ID(內部名稱)add_worktree:
if (safe_create_leading_directories_const(sb_repo.buf))
die_errno(_("could not create leading directories of '%s'"),
sb_repo.buf);
while (mkdir(sb_repo.buf, 0777)) {
counter ;
if ((errno != EEXIST) || !counter /* overflow */)
die_errno(_("could not create directory of '%s'"),
sb_repo.buf);
strbuf_setlen(&sb_repo, len);
strbuf_addf(&sb_repo, "%d", counter);
}
name = strrchr(sb_repo.buf, '/') 1;
初始sb_repo.buf包含從路徑派生的“已清理”名稱,在您的情況下,路徑是foo添加到 Git 目錄和作業樹子目錄 ( $GIT_DIR/worktrees/foo) 的名稱。這里len是數字后綴部分進入的點。因此,如果初始mkdir呼叫以 . 失敗EEXIST,foo則 strbuf 的部分將sb_repo.buf替換為foo1,foo2等,直到mkdir呼叫成功(回傳 0)或以其他方式失敗比EEXIST。
[有時 Git] 會創建
.git/worktrees/foo1/。我認為附加 1 是因為存在一些命名沖突。
如果已經存在 , 就會發生這種情況.git/worktrees/foo,因此mkdir呼叫回傳一個錯誤,EEXIST錯誤號為錯誤號。如果有一個路徑以 結尾的作業樹foo,或者被清理為 的東西,這反過來又會發生foo。]
[請注意,當 Git 存盤庫存盤在云同步檔案夾(ICloud、Dropbox 等)中時,您還可以看到隨機錯誤。云同步軟體進入存盤庫并在嘗??試同步時損壞它。不過,這里可能不是這種情況。]
(有點好奇為什么你關心作業樹特定檔案在里面的位置$GIT_DIR。我不知道為什么 Git 會花這么多精力來創建一個基本名稱,而不是僅僅使用mkdtemp或等價物生成隨機 ID:有 Git這樣做,人們就不會想在里面.git/worktrees閑逛了。要使用特定于作業樹的參考,例如HEAD并將修訂名稱一分為二,請使用git rev-parseor git update-ref,它知道如何自行執行此操作。我認為,有一點臨時索引檔案的問題:索引檔案需要是每個作業樹的,如果有git rev-parse --git-internal-worktree-path這樣的名稱來構建這樣的名稱會很好。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/426171.html
上一篇:子模塊中的相對路徑失敗
