簡體   English   中英

將 SVN 結帳轉換為使用 git (git-svn)

[英]Convert an SVN checkout to use git (git-svn)

我使用保存在 svn 中的軟件進行版本控制。 我想使用 git (git-svn) 但是該軟件需要大量設置和配置才能使用。 有一些工具可以處理所有設置,包括通過 svn 檢查所有代碼。

git-svn 的所有文檔(我已經能夠找到)都需要使用 git-svn 重新結帳。

有沒有辦法轉換現有的 svn checkout 以便它可以使用 git-svn?

不,一個 git-svn 克隆將整個存儲庫轉換為 git。 SVN 簽出沒有整個存儲庫,因此無法從中克隆。 這是從 SVN 或 CVS 切換到分布式系統(如 git)的主要優勢。

你可以這樣做:

  1. 使用 git-svn 將 SVN 樹完全克隆到一個臨時目錄。 確保使用與現有結帳完全相同的版本。
  2. 將“.git”文件夾從 git-svn checkout 的頂層移動到 SVN checkout 的頂層。
  3. 然后你要么需要告訴 Git 忽略“.svn”目錄,要么你可以將它們全部刪除。
  4. 刪除 git-svn 結帳。
  5. 在那里,現在您可以使用 Git 和 git-svn 操作現有文件。
  6. 做一個“git status”,希望它說沒有變化。

我假設您可能想保留歷史記錄。 但是,如果您(或任何其他偶然發現此頁面的人)不需要歷史記錄,您可以使用此處解釋的“導出”功能: https ://stackoverflow.com/a/419475/2437521。

另一種不修改原始 Subversion 工作副本且不需要您復制它的方法是使用補丁:

  1. 使用 git-svn 將您的 Subversion 樹完全克隆到一個新目錄,該目錄將成為 Git 存儲庫。 確保使用與現有結帳完全相同的版本。 您可以使用git reset --hard :/r<revision>強制它在克隆后成為相同的修訂版,其中<revision>是 Subversion 工作副本更新到的修訂版(請參閱此處使用svn info )。
  2. cd到您的 Subversion 工作副本。
  3. 使用svn status確保所有新文件都標記為A (或使用svn add添加它們),並且所有已刪除的文件都標記為D (或使用svn rm刪除它們)。
  4. 運行svn diff >patch.diff創建補丁文件。
  5. patch.diff復制到之前創建的 Git 存儲庫的頂部。
  6. cd到之前創建的 Git 存儲庫的頂部。
  7. 運行git apply -p0 patch.diff以將補丁應用到 Git 存儲庫的工作樹上。

現在您可以使用git status完成更改,然后git add / git commit它們保存在本地存儲庫中。

這似乎有效:

(警告:我沒有對此進行足夠的測試。請在嘗試之前進行備份。)

  1. 用當前的 SVN URL 初始化 git-svn:

     git svn init $(svn info --show-item=url)
  2. 獲取 Git 的 SVN HEAD。 不幸的是,這會下載 HEAD 而不是使用本地結帳,但它只下載到.git

     git svn fetch -r HEAD

    git-svn fetch 會抱怨類似

    錯誤:未跟蹤的工作樹文件“”將被合並覆蓋。

    但是當前提交將對應於 SVN HEAD。 工作目錄將保留在原處。

  3. 暫存區現在包含 SVN HEAD; 取消它。

     git reset HEAD -- .

存儲庫的狀態現在應該與您執行git svn clone -r HEAD <URL>然后在頂部應用您的更改相同。

暫無
暫無

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

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