Git 是分散式版控,在任何資料夾下個 git init 指令就能開始管理版本,不管是 Side-Project、小程式,企劃案、設計草稿、專題作業還是碩士論文,Git 就能幫你保留版本回到從前,不用擔心改壞沒法重來。不過,只存在自己電腦風險太高,要是硬碟壞了心血結晶便付之東流,將資料定期推送到伺服器保存才是王道。另外,集體創作或多人專案也一定得靠 Git 伺服器讓團隊成員共享,進行協作開發。

講到 Git 伺服器,Github 自然是當今首選。微軟收購 Github 後送給開發者一份禮物 - 開放三名以下參與者的私有儲存庫 (Private Repository) 免費使用,2020 年 4 月再進一步大放送,取消免費私有儲存庫的協作人數限制。因此,若無其他考量,用 Github 就對了!

對企業用戶而言,受限網路存取政策或禁止內部資料上傳外網,Github 等雲端服務可能不是選項,此時就得考量架設內部 Git 版控伺服器。對 Visual Studio 開發來說,TFS (Team Foundation Server) 除了版控外還提供專案管理、報表、自動建置/測試/部署等功能,絕對是 Git 私服首選。(補充:TFS 自 2019 年起更名為 Azure DevOps Server,不過我每次聽到 Azure DevOps Server 要想一下才能意會,大部分時侯我還是叫它 TFS 比較順口易懂,大家就把它想成某位算命剛改名的朋友,叫新舊名字都通,我猜 TFS 本人不會介意的 XD)

我有個特殊需求,一些上不了檯面的零散小工具,為它們在部門 TFS 伺服器開新專案還另外設權限太隆重,全部丟進某個「庶務二課專案」又太龐雜。尤其是小工具性質偏小團隊或個人專用,丟上全部門的版本伺服器說起來怪怪的,這種情境下,自己架台 Git 小私服供團隊成員共用甚至個人自用,似乎是不錯的例子。

講到「Git 私服」,先介紹最簡單的玩法:完全不用裝軟體,直接用 Windows 的共享資料夾功能就行。

其實,先前在作者(Auhtor)與提交者(Commmitter)差異實驗文章我就有示範過類似技巧了。當時要展示兩個開發者對上游做 pull、push 動作,整個過程卻完全沒用到 Github 或 TFS,而是另開一個 upstream 資料夾,用 git init --bare 建了一個 Bare Repository,這個 upstream 資料夾可當成同步來源。Bare Repository 是一種特殊的儲存庫模式,裡面是平常放在 .git 子資料夾下的內容,它無法 git add、git commit,但可當成其他儲存庫 pull 或 push 的來源。依此原理,我們只需找一台 Windows 主機,建立儲存庫資料夾並 git init --bare,再設定網路分享(記得設定權限,要 pull 它的使用者需有讀取權限,如要 push 則需有寫入權限),Windows 主機就搖身一變成為「Git 私服」了。

以下是我的實地練演:

  1. 在 Hyper-V Windows Server 建立 C:\GitRepos\git-priv-svr-demo,並執行 git init --bare 建立同步專用的 Git Bare Repository:
  2. 將 C:\GitRepos\git-priv-svr-demo 開成網路分享資料夾,先只設定 user1 Read 權限:
  3. 在 Windows 10 客戶端使用 git clone \ip-address\git-priv-svr-demo 即可複製本地端儲存庫並建立遠端關聯。完成 git add、git commit,但 git push 時出現錯誤,原因是剛才故意只開讀取權限,clone、pull 沒問題,push 要寫入時存取會被拒。
  4. 回到 Windows Server 將 user1 權限改成 Read/Write:
  5. 再試一次 git push,成功!

是不是超簡單?

同理,你也可在 Linux 主機建立目錄跑 git init --bare,客戶端可透過 ssh 協定存取 Linux 上的資料夾,原理跟 Windows 分享目錄沒什麼兩樣,這部分教學不少(在 Linux 中架設 Git 伺服器教學(使用 SSH 加密傳輸)by G.T. WangDebian Linux 架設使用 SSH 存取 的 Git Server by Tsung),有需要的同學自己爬文。

以上介紹的做法不需要安裝軟體,但缺點是少了統一的管理介面、每個儲存庫的權限要個別設定,管理工作太瑣碎。要想做到 Github、TFS 等級的管理設定,就要考慮安裝 Git 伺服器,例如:GitLab Server 或較輕巧的 Gogs,前題是需要一台 Linux Server (或跑 Docker);至於 Windows 平台,則有個 Bonobo Git Server,是個用 ASP.NET MVC 寫的「開源專案」,嘿,大家用膝蓋想也知道我會選哪個。下一篇,我們就來玩玩矮黑猩猩 - Bonobo。

This article introduce how to convert Windows to as private Git server with shared folders.


Comments

# by YanagiSiki

黑大倒數第二行的Gogs打成Cogs 另外Gogs有個fork出來的版本叫做Gitea,也很香der,可以試試看:D

# by Jeffrey

to YanagiSiki,謝謝指正,已修改。Gitea 在 FB 也被大家稱讚到爆,我不試用看看估計會引起公憤 XD

# by ByTIM

請問有TFS跟GIT,這兩個版控的優缺點文章嗎?

# by Jeffrey

to ByTIM, 我猜你想問的是這個 https://blog.darkthread.net/blog/tfvc-vs-git/

# by ByTIM

To Jeffrey:感謝回覆,目前在公司待了快三年,也用了快三年的TFVC,曾發生一些程式碼衝突,有時沒很仔細的人工比對,導致漏一些程式碼,再想要不要推薦公司換GIT看看,先研究看看。

# by Jackson281

一些不了檯面的零散小工具 "上"

# by Jeffrey

to Jackson281, 己修正,謝謝。

# by t4dee

Bonobo Git Server介面陽春~專案一多就變難用。可以直接裝Azure DevOps Server,取代Bonobo Git Server嗎?

# by Jeffrey

to t4dee,Azure DevOps Server 功能完整很多,但相對伺服器安裝及維護成本較高,自用或小型應用我推薦 Gitea,簡潔輕巧,幾乎是個私人版 Github。 https://blog.darkthread.net/blog/gitea/

# by t4dee

讚唷,謝謝黑大回覆~~

# by jb

可否請教黑大。要讓 local repo 與 github 及 live windows apache server 同步的最簡易方式? 簡單的說,我在 local commit 後,github 會同步(這幾乎不用做任何事就會發生),但想讓已經在運行網頁的 windows apache server 也一起同步。

# by Jeffrey

to jb,有點看不懂,local commit 後應該要 git push 才會上傳到 github 吧? "live windows apache server 同步" 是指將 commit 的內容部署到 Apache Server 網站?

# by jb

是的!部署到 apache server 網站!

# by Jeffrey

to jb, 意思是「若本次Commit修改了a.html及b.html,只部署有更動的檔案到 Apache www root」? 若是,可參考這個 https://blog.darkthread.net/blog/export-git-commit-files/

# by denny

請問黑大,這個方法可以搭配TortoiseGit使用嗎?還是只能用cmd操作 我怎麼用都失敗 還有就是我有設定權限還是沒辦法push上去請問是什麼問題

# by Jeffrey

to denny,TortoiseGit 我沒什麼使用經驗,幫不上忙。你可以先用本機資料夾當來源 clone 及 push 測試,理論上 \\ UNC 路徑與本機資料夾概念是一樣的,若只能 clone 不能 push,感覺權限問題的可能性頗高。

# by denny

感謝黑大回復,昨天又摸了三個小時終於可以使用了,結果是自己url打錯...

Post a comment