The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

遷移 Git 遠端儲存庫的 3 種方法與注意事項

用了 Git 之後,遷移儲存庫 (Repository) 真的簡單到不行,最近把一些公司用 Git 版本控管的專案遷移到 Visual Studio OnlineBitBucket 平台,雖然遷移的過程十分順利,但還是有些注意事項與經驗可以分享,而且應該也有很多人不太清楚怎樣在不同平台之間遷移 Git 遠端儲存庫,所以特別撰文說明。

以下我透過幾種不同的遷移情境,來分別講解遷移 Git 儲存庫的過程:

1. 從其他 Git 平台遷移到 Bitbucket

BitBucket 平台,對於匯入專案的功能做得非常好,有現成的 Import repository 功能可用,直接在 BitBucket 網站上就可以順利完成所有遷移的動作。

你可以看到他預設支援的來源(Source)種類還蠻多的,除了知名的開源平台可以順利遷移外,你自己架設的 Git 或 Subversion 儲存庫也都可以順利遷移,只要輸入 URL 與設定認證的帳號、密碼就可以快速遷移成功,非常方便。

除此之外,若要匯入 GitHub 上面的專案,從該頁面的右邊也可以看見一個 Import from GitHub 的按鈕,透過這個功能可以直接與 GitHub 整合,經過認證授權後會直接列出你在 GitHub 上面的專案,並按下 Import 按鈕就會自動匯入完成,完全是無腦匯入工具。

image


2. 從任何 Git 儲存庫遷移到任何 Git 儲存庫 ( 開發中專案 )

我所謂的「開發中專案」,是指「已經將遠端儲存庫 複製 ( clone ) 下來的專案」。這些專案其實已經是遠端儲存庫的「完整備份」,所以要遷移到另一個遠端儲存庫,並不需要讓遠端對遠端的複製,其實只要很簡單的將本地儲存庫 推送 (push) 到另一個遠端儲存庫即可。

我們知道 Git 預設的遠端儲存庫名稱為 origin,你可以透過 git remotegit remote -v 得知遠端儲存庫的 URL,如下圖示:

如果我們想要遷移到另一個 Git 平台,首先你要取得新的遠端儲存庫 URL,然後替換掉原本在 origin 裡面註冊的網址,最後再推送到 origin 即可 (此時已經是新的網址)。

我們以遷移到 Visual Studio Online 為例,假設網址如下:
https://willh.visualstudio.com/DefaultCollection/_git/test

那麼你可以輸入以下指令,重新指定 origin 註冊的 URL 位址:
git remote set-url origin https://willh.visualstudio.com/DefaultCollection/_git/test

最後再執行 git push --allgit push --tags 就可以將本地端的所有內容推送到新的遠端儲存庫。

3. 從任何 Git 儲存庫遷移到任何 Git 儲存庫 ( 沒在開發的專案 )

我所謂的「沒在開發的專案」,是指「專案只存在於遠端儲存庫中,尚未複製回來的那些專案」。這些專案勢必要複製回來,然後才能推送到新的遠端儲存庫。不錯,這時建議你不要直接用 git clone 把專案複製回來,而要用 git clone --bare 的方式複製回來。

為什麼呢?因為透過 git clone 把專案複製回來,會同時建立 工作目錄 (Working Directory) 與 本地儲存庫 (Local Repository),如果你根本不需要多儲存一份工作目錄的話,你就可以利用以下步驟,僅取回一個本地儲存庫就好,然後再透過指令將這份本地儲存庫同步到新的遠端儲存庫去。

我們用以下 GitHub 專案為例:
https://github.com/doggy8088/CacheControlWithoutMaxAgeTest.git

然後我們打算推送到以下 Git Repo URL:
https://willh.visualstudio.com/DefaultCollection/_git/test

那麼我們所要輸入的指令如下:

  • git clone --bare https://github.com/doggy8088/CacheControlWithoutMaxAgeTest.git
  • cd CacheControlWithoutMaxAgeTest.git
  • git push --mirror https://willh.visualstudio.com/DefaultCollection/_git/test

等執行 git push --mirror 同步完成後,新的遠端儲存庫就有完整的 Git 版本資訊了!

最後,你再將下載的 CacheControlWithoutMaxAgeTest.git 資料夾砍掉即可。

注意事項

由於 Git 版本控管的特性 (分散式版本控管),每次複製專案回來,都是一份完整的 Git 儲存庫副本 (可視為是完整備份)。所以,當你將原本的遠端儲存庫遷移到了另一個遠端儲存庫之後,所以對所有團隊成員來說,原本的 Git 遠端儲存庫與新的 Git 遠端儲存庫其實是「完全相同」的儲存庫。

因此,開發人員只要將 origin 所設定的 URL 重新設定到新的 Git 遠端儲存庫 URL 即可,指令就是:
git remote set-url origin https://willh.visualstudio.com/DefaultCollection/_git/test

是的,就這麼簡單,剩下的完全不需要異動,你在變更完網址之後,就繼續做你的 git push / git pull 等動作;也不用把開發中的資料夾砍掉,然後再從新的遠端儲存庫複製(clone)回來,是不是非常漂亮呢! ^_^

相關連結