這裡分享一下我對 OneDrive 用 Git 配合 Windows 的 mklink 指令做版本管理的方法
環境:
- 我的電腦系統是 Windows11。
- 電腦上有登入 Microsoft 帳號的 OneDrive 同步資料夾。
- OneDrive 上有程式碼,且是多人共用。
雖然我個人是不太喜歡把程式放在 OneDrive 中,因為 OneDrive 沒有像 Git 一樣的管控概念,比較像是注重同步檔案功能的工具而已,雖然 OneDrive 可以去看檔案的各個版本及修改時間,但是沒有辦法像 Git 一樣很方便地看到哪一批檔案在哪個時間、被誰修改、修改了哪幾行。
OneDrive 也沒有辦法像 Git 一樣先對檔案進行修改不要同步,等修改確定後再同步,也沒辦法開 Branch 做多 feature 開發管理。
不過因為公司有特別需求 (比如檔案使用者有非RD人員不會用 Git、檔案很少修改、程式內容不多之類的) 所以在這部份採用了 OneDrive,為了我自己能夠較好的管理對 OneDrive 裡各 feature 需求的版本控管,我開始想方法用 Git 來對 OneDrive 進行管理。
我的需求是:
- 希望能針對不同的 feature 開發建立 branch 來控管並開發,但各 feature branch 在開發時能不修改到 OneDrive 的檔案,希望等到開發完後才將 branch 的修改 merge 至 OneDrive 中的檔案。
- 不希望新增目前沒有在 OneDrive 中的不必要檔案,例如 Git 的 .git, .gitnore 等檔案。
- OneDrive 中的檔案變動 (例如可能別人修改了檔案) 能夠即時的反映在 Git repository 中,方便我知道別人修改了哪些檔案,在 feature branch merge 時能夠被檔下來得到提醒告知之類的,也要有能處理 conflict 的能力。
最後這是我想到的,利用了 Windows mklink 指令來把 Git repository directory 跟 OneDrive 資料夾同步,並配合 Git worktree 做 feature branch 版控的方法,特此分享:
假設 OneDrive 資料夾位置在
C:\Users\<userName>\xxx-onedrive-folder
先建立資料夾,例如: D:\MyOneDriveRepository-masterBranch
用 git init 把資料夾設定成 git repository,假設一開始的 branch 叫做 master。
然後執行以下指令 (/J 代表 Directory Junction):
mklink /J C:\Users\<userName>\xxx-onedrive-folder D:\MyOneDriveRepository-masterBranch\repoLinkToOneDrive
這樣就會得到一個被建立起來的資料夾:
D:\MyOneDriveRepository-masterBranch\repoLinkToOneDrive
並且 C:\Users\<userName>\xxx-onedrive-folder 和
D:\MyOneDriveRepository-masterBranch\repoLinkToOneDrive
會連結起來成為同步狀態
把 D:\MyOneDriveRepository-masterBranch\repoLinkToOneDrive 連同裡面的檔案都進行第一次的
git commit 就可以開始進行 Git 版本控管了。
因為 OneDrive 可能會跟別人一起合作共用,所以如果在開發新 feature 前我們不希望對 OneDrive 裡的檔案做修改,
也就是說記住不要切換
D:\MyOneDriveRepository-masterBranch
的 branch,讓它永遠在 master branch。
如果有要開發新 feature,我們可以用 git branch <feature branch> 建立新 branch (不要切換過去),例如新 branch 叫 featureBranch,
利用 git worktree 的方式在另外一個資料夾 checkout feature1 去開發,
例如開發路徑是 D:\MyOneDriveRepository-otherBranch\repoLinkToOneDrive,
可以執行
git worktree add D:\MyOneDriveRepository-otherBranch featureBranch
這樣就會得到一個被建立的資料夾:
D:\MyOneDriveRepository-otherBranch
我們就可以在裡面開發 feature1 branch 的程式了。
最後等 feature 開發完後,可以再回到
D:\MyOneDriveRepository-masterBranch
用 git merge featureBranch --no-ff
來把 featureBranch merge 至 master branch 來改變 OneDrive 的檔案。
這樣的作法有幾點好處:
- 如果有別人修改了 OneDrive 中的檔案,因為有 Git 管理的關係,我們也可以很容易的發現,例如 git merge 時會因為改到同一個檔案而被擋下來。
- 可以把別人的修改 commit 至 master branch 做記錄,雖然不能容易地知道哪幾行是何時被誰修改的有點可惜 (還要特別去 OneDrive 網頁裡查 log 有點太麻煩了 )。
- git 生成出來的 .git 檔案不會被上傳到 OneDrive 上,因為我們是對跟 OneDrive 做 Directory Junction 的資料夾的外層資料夾做 git init,所以 .git 並不在跟 OneDrive 做 Directory Junction 的資料夾之中。