簡體   English   中英

將本地 git 存儲庫的准確 state 復制到另一個本地存儲庫

[英]Copy exact state of local git repo to another local repo

有沒有辦法將本地 git 存儲庫(未提交的更改和所有)的確切 state 復制到另一個本地存儲庫?

目標 repo 應該切換到源 repo 的確切 state,包括分支、提交和自上次提交以來任何未提交的更改 - 編輯、新文件、刪除......

每次我需要這個功能時都沒有復制整個目錄,我想不出該怎么做。

顯然,將目標倉庫檢查到同一個提交會很容易,但是我不確定這是未提交的更改。

編輯(為什么我想要這個。)我正在構建一個本地構建系統(用於 Unity 游戲),通常在 Unity 內部進行構建時,您不能將該程序用於其他任何事情。 所以我有一個系統,其中另一個 Unity 實例在項目文件的副本上進行構建,每次觸發構建時,我都會刪除舊副本並制作新副本。 但是我的想法是,如果副本在同一個提交上並且說只有兩個未提交的文件不同,那么僅修補狀態會快得多。 我在測試時構建未提交的工作,因此提交更改並不是一個真正的選擇!

任何建議都非常感謝!

干杯

每次我需要這個功能時都沒有復制整個目錄,我想不出該怎么做。

復制整個目錄有什么問題? 如果您真的不想這樣做(例如因為它很大),請使用任何文件夾同步實用程序,例如rsync 我經常使用這兩種方法。

您可以使用存檔器( tar或其他)收集整個存儲庫和工作樹 state 並將其復制到其他文件樹區域:

cd /path/to
tar cf - repo | (cd /different/path; tar xf -)

例如,將整個文件樹從/path/to/repo復制到/different/path/repo 這會復制存儲庫本身( .git中的所有文件)和工作樹(所有不在.git中的文件)。

這里有一些警告。 最重要的是,工作樹頂層下的.git必須確實是包含存儲庫的目錄,而不僅僅是像git worktree add創建的文件。

使用 in-Git 方法,例如git clone是行不通的:它們只復制存儲庫 工作樹不是存儲庫的一部分:

每次我需要這個功能時都沒有復制整個目錄,我想不出該怎么做。

那是因為 Git 字面上會這樣做。 工作樹——你的工作樹——是的,不是 Git 的,它不是 Git 存儲庫的一部分。 它就在存儲庫旁邊,即.git子目錄中的內容。

如果你有 Git 2.5 或更高版本——最好是 2.15 或更高版本,因為在此之前有一個非常討厭的錯誤1——無論你想做什么,通過git worktree add可能會更好地處理。 這會創建一個單獨的工作樹,這又是您的,而不是 Git 的,其中 Git 在運行git worktree add時對您選擇的某些提交或分支進行 git git checkout 第二個工作樹沒有自己的存儲庫:它使用原始工作樹的存儲庫,方法是創建一個名為.git的文件,而不是一個名為.git的目錄。

(實際存儲庫在git worktree add處獲取了很多 state 文件來跟蹤這個添加的工作樹的存在。添加的工作樹需要添加一個新的索引,新的HEAD等等,所有的它們專用於新的工作樹,並與索引和HEAD等用於主工作樹,主工作樹仍然位於主存儲庫旁邊。請注意,如果您稍后使用上述tar技巧復制實際存儲庫,它仍然會認為它有這些添加的工作樹。如果它們仍然存在,那很好;如果不存在, git worktree prune將使復制的存儲庫更新其外部世界外觀的概念。)


1錯誤是git gc未能查看添加的HEAD和索引等文件。 這意味着,如果您:

  • 在添加的工作樹中使用分離的 HEAD,並進行新的提交,它們被刪除 (,),並且
  • 即使您不使用分離的 HEAD,如果您git add更新的文件但不提交,則可以刪除任何新的存儲庫級 blob 對象(!)

這導致一團糟。

標准默認的 14 天寬限期意味着如果您在 14 天內完成所有工作,然后丟棄添加的工作樹,則此錯誤永遠不會影響您,因此如果您的 Git 版本低於 2.15,則可以使用git worktree add只要您在兩周內完成添加的工作樹的所有操作,就可以安全地進行操作。

(不過,這個錯誤實際上咬了我。幸運的是,添加的工作樹只是一個我已經放棄但還沒有刪除的實驗,我能夠清理這些東西。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM