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

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

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

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

在 [BitBucket](https://bitbucket.org) 平台，對於匯入專案的功能做得非常好，有現成的 [Import repository](https://bitbucket.org/repo/import) 功能可用，直接在 [BitBucket](https://bitbucket.org) 網站上就可以順利完成所有遷移的動作。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/e7c6be87130a1003d25e-SNAGHTMLbfe0a8a.png)

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

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/f38440053b44a0fe5805-image_2438.png)

除此之外，若要匯入 GitHub 上面的專案，從該頁面的右邊也可以看見一個 [Import from GitHub](https://support.atlassian.com/bitbucket-cloud/docs/import-a-repository/) 的按鈕，透過這個功能可以直接與 GitHub 整合，經過認證授權後會直接列出你在 GitHub 上面的專案，並按下 Import 按鈕就會自動匯入完成，完全是無腦匯入工具。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/c709a8e5f15f71ccbca9-image_2439.png)

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/dd4ee5ce2e6eb135c5c6-image_2440.png "image")

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/8723db174fdb8411b08d-image_2441.png)

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/77acae4d14be9e912c8b-image_2442.png)  

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

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

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

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/347c3b432ba9f58f3fca-image_2443.png)

如果我們想要遷移到另一個 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 --all** 與 **git 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)回來，是不是非常漂亮呢！ ^\_^

**相關連結**

-   [Importing an external Git repository – GitHub Help](https://help.github.com/articles/importing-an-external-git-repository)
-   [Changing a remote's URL – GitHub Help](https://help.github.com/articles/changing-a-remote-s-url)
-   [8.2 Git and Other Systems - Migrating to Git](http://git-scm.com/book/en/Git-and-Other-Systems-Migrating-to-Git)
-   [Migrate to Git from SVN | Atlassian](https://www.atlassian.com/git/migration)
