我將把現在位于 repo A 中的 Visual Studio 解決方案復制到新的解決方案 B 中,并在 github 上為其創建新的 repo。
A 根本不會被開發。但我需要整個 A 歷史在 B 中可見。
我該怎么做?
我可以在不安裝 git 的情況下在 VS 中執行此操作嗎?
Visual Studio 2022 專業版/Windows 11
uj5u.com熱心網友回復:
Git 存盤庫的核心包含兩個資料庫:
一個資料庫——通常更大——包含 Git 的提交物件和其他物件。每個物件都有一個哈希 ID(OID或Object ID ?),這是 Git 檢索物件的方式。任何給定的提交都包含與該特定提交相關的所有檔案的完整快照,在該提交中一直凍結。(Git 通過創建子物件并通過重復資料洗掉從字面上共享檔案的相同副本來做到這一點,并且還壓縮檔案,有時非常成功,因此每個提交都包含每個檔案的完整快照這一事實不會膨脹存盤庫——一些存盤庫實際上比它們保存的檔案小得多)。
每個提交物件還包含先前(父?)提交的哈希 ID 串列。這個串列通常只有一個條目長,盡管至少有一個提交(第一個)有一個空串列,因為那時沒有以前的提交,并且合并提交在這個串列中有兩個(或可能更多)父級。
存盤在每個提交中的父串列將提交形成有向無環圖或 DAG。存盤在這個大資料庫中的 DAG就是歷史。如果你有提交,你就有歷史。如果你沒有提交,你就沒有歷史。所以這部分很簡單:只需獲取所有提交,您將擁有所有歷史記錄。
一個單獨的資料庫包含人類可讀的名稱:分支名稱、標簽名稱、遠程跟蹤名稱和其他名稱。Git 需要提供它以供人類使用,因為資料庫物件的哈希 ID (OID)(Git 需要從資料庫中檢索這些物件)是隨機的,人類無法處理。通過在名稱下存盤特別重要的哈希 ID ,Git 使您可以輕松地要求 Git 獲取“版本”或“分支的最新提交”。 Git通過查找存盤在該名稱中的哈希 ID 來提供哈希 ID。每個名稱只存盤一個哈希 ID,這對于 DAG 來說就足夠了。
v2.1main
所以:
我將把現在位于 repo A 中的 Visual Studio 解決方案復制到新的解決方案 B 中,并在 github 上為其創建新的 repo。
請注意,VS“解決方案”不僅僅是一個 Git 存盤庫,只要整個解決方案包含在一個(單個)Git 存盤庫中,克隆存盤庫就足夠了。
要克隆原始(repo A)存盤庫,請使用git clone. 這:
將整個提交資料庫復制到使用相同哈希 ID 的新資料庫(所有 Git 哈希 ID 都是通用的:所有 Git 軟體都同意對同一物件使用相同的OID ,這就是 Git 的真正魔力)。
從名稱資料庫中讀取并轉換名稱,以構建新的名稱資料庫。新資料庫保持標記名稱不變,但將原始存盤庫的分支名稱轉換為新克隆中的遠程跟蹤名稱。
最后,執行最終
git switch或git checkout步驟以從一個特定分支中提取一個特定提交。由于新克隆還沒有分支名稱(請記住,Git不需要這些型別的分支:它只需要物件;需要為它們命名的是人類),這通常會失敗,但 Git 會從遠程創建一個分支- 自動跟蹤名稱。
Git 在最后一步中創建的分支名稱是您在運行時告訴它使用的名稱git clone。如果您不告訴它某個特定的名稱,您的 Git 軟體會詢問其他 Git 軟體(在這種情況下,可能在 GitHub 上,無論如何存盤存盤庫 A 的地方)他們推薦哪個名稱。然后,您的 Git 使用存盤在您的 Git從其 分支名稱創建的遠程跟蹤名稱中的哈希 ID 將其創建為分支名稱。(哇!)
舉個例子就清楚多了。如果他們有已命名的分支main并且develop您克隆了他們的存盤庫,您將獲得一個origin/main和一個origin/develop:遠程跟蹤名稱,以記住他們的分支名稱。如果他們隨后建議您的 Git 應該創建main,您的 Git 使用您的(origin/main您的 Git 由他們制作的)來main創建您的分支名稱main,選擇與相同的提交,origin/main它選擇與他們的main. 所以你現在有一個分支。
克隆中的歷史記錄是克隆中的一組提交,可以通過所有名稱找到:標記名稱、遠程跟蹤名稱和一個新的分支名稱。如果你愿意,你可以創建額外的分支名稱來記住特定的提交;例如,您可以為每個遠程跟蹤名稱創建一個分支名稱。但通常你可能只是想要main或master無論如何:例如,當前只能通過 找到的任何提交origin/develop都是不相關的,不需要保留。
現在你有了一個克隆,你可以推送到 GitHub 上一個新的空倉庫 B
現在是時候在 GitHub 上創建一個存盤庫了:repo B。
您可以使用gh命令列界面執行此操作(請參閱github-cli) 例如從 bash 或 zsh 或 PowerShell 等 shell,或者您可以使用 GitHub 提供的 Web 界面執行此操作。無論哪種方式,您都應該將其設為空存盤庫。一個空的存盤庫有一對空的資料庫:沒有提交或其他物件,也沒有名稱。但它仍然存在,即使它是空的。
現在GitHub 上存在repo B ,您將使用命令列界面(再次通過 bash 或 zsh 或 PowerShell 或其他方式)告訴您的Git軟體替換originURL。運行時git clone,您的 Git 軟體將 repo A 的 URL 保存在名稱下origin。但是您不再想與訪問 repo A 的軟體交談。您現在想與訪問 repo B 的 GitHub 軟體交談。所以:
git remote set-url origin <url>
<url>用repo B 的實際 URL替換該部分,無論是https://github.com/...還是ssh://[email protected]/...(兩者都可以:詳細資訊涉及您必須單獨執行的 GitHub 設定事情)。然后使用git remote -v以確保您已正確設定所有內容。
一旦遠程origin是您的存盤庫 B,運行git push --all origin以填充 GitHub 副本中的兩個資料庫。這將為您創建的所有分支填充所有可訪問的物件,并設定它們的所有分支名稱。然后運行以使用所有標簽更新他們的名稱資料庫。git push --tags origin
請注意,您在本地擁有的只能通過遠程跟蹤名稱(例如,origin/develop)找到的提交不會被發送到此處的存盤庫 B。如果您希望發送它們,請創建一個分支名稱:
git switch develop
例如,您會注意到您沒有develop, 但您確實有origin/develop, 并將使用您的姓名和保存的提交哈希 ID使用相同的哈希 IDorigin/develop創建一個新的。develop然后,您可以git push origin develop(或git push --all origin再次)develop在 GitHub 上創建名稱并在其物件資料庫中填寫那些缺失的物件。
如果您在該git push --all origin步驟之前創建所需的所有分支名稱,您將獲得傳輸的所有物件和分支名稱,因為--all意味著發送所有分支名稱。
可選:在 GitHub 上節省空間并啟用拉取請求
完成以上所有操作后,您將在 GitHub 上獲得一個獨立的repo B。也就是說,這個新的存盤庫 B與任何其他 GitHub 存盤庫都沒有連接。您不能從GitHub 上的 repo B 發出拉取請求。如果這就是你想要的,那很好。
但是,如果在您創建存盤庫 B 之前,GitHub 上存在存盤庫 A,GitHub 會為您提供一種通過單擊網頁按鈕來制作存盤庫 A 的完整副本的方法。使用此按鈕將復制兩個資料庫,即,您將獲得所有物件(完整歷史記錄)以及所有分支和標簽名稱。(GitHub 不使用遠程跟蹤名稱,因此這里沒有可復制的內容。遠程跟蹤名稱適用于您的筆記本電腦 Git 存盤庫。)
使用這個按鈕——一個綠色的大按鈕——通過在他們的系統FORK上節省一堆磁盤空間來幫助他們(GitHub),如果你想創建拉取請求,也可以幫助你。你說:
A 根本不會被開發。
這表明您從不打算創建任何對repo A 的拉取請求。但是,如果您對此改變主意,您可能希望使用“fork the repo”按鈕并在 GitHub 上節省空間。不過,這完全取決于您。
最后幾項
我可以在不安裝 git 的情況下在 VS 中執行此操作嗎?
可能不是,但我不使用 Visual Studio。
我要復制 Visual Studio 解決方案...
據我了解,“解決方案”包括一個.sln檔案。該檔案確實進入存盤庫,因此復制提交將為您提供原始解決方案檔案。由于歷史記錄(任何 Git 存盤庫中的現有提交)一直完全凍結,因此該解決方案可能包含錯誤的名稱。您無法解決此問題,除非將每個歷史提交替換為新的不同提交(包含不同的檔案)。這可能不值得做,但同樣,我實際上并沒有使用 VS。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/476729.html
上一篇:時間序列資料可視化問題
