1. 程式人生 > >git init 與 git init --bare 區別

git init 與 git init --bare 區別

裸倉庫 git push inf ext code ref 資料 只有一個 info

git init 與 git init --bare 區別

發現問題
最早是在公司的wiki上發現了這個命令,google後發現值得記錄下來

實踐中發現的區別

網上找了很多資料,但說的很亂,幹脆在自己的服務器上執行對比了一下:

git init demo1  # 表示創建一個叫demo1的私人倉庫
# git init目錄下只有一個.git隱藏文件夾,裏面包含各種信息
git init --bare deme2  # 表示創建一個裸庫,主要應用場景是作為公共倉庫
# 裸庫的目錄下沒有隱藏.git目錄,全都是顯示的,沒有.git這個目錄,進入文件直接是文件內容
# 一般來講,作為遠端備份或公共版本庫時,應該使用git init --bare。

技術分享圖片
Workspace:工作區
Index / Stage:暫存區
Repository:倉庫區(或本地倉庫)
Remote:遠程倉庫

詳細說一下使用 --bare 參數的含義,使用 --bare 參數初始化的倉庫,我們一般稱之為裸倉庫, 因為這樣創建的倉庫並不包含 工作區 , 也就是說,我們並不能在這個目錄下執行我們一般使用的 Git 命令。

原因分析

參考鏈接

用"git init"初始化的版本庫用戶也可以在該目錄下執行所有git方面的操作。但別的用戶在將更新push上來的時候容易出現沖突。

比如有用戶在該目錄(就稱為遠端倉庫)下執行git操作,且有兩個分支(master 和 b1),當前在master分支下。另一個用戶想把自己在本地倉庫(就稱為本地倉庫)的master分支的更新提交到遠端倉庫的master分支
他就想當然的敲了命令git push origin master:master

自然就會發生沖突

因為遠端倉庫的用戶正在master的分支上操作,而你又要把更新提交到這個master分支上,當然就出錯了。
但如果是往遠端倉庫中空閑的分支上提交還是可以的,比如git push origin master:b1 還是可以成功的

解決辦法就是使用”git init –bare”方法創建一個所謂的裸倉庫,之所以叫裸倉庫是因為這個倉庫只保存git歷史提交的版本信息,而不允許用戶在上面進行各種git操作,如果你硬要操作的話,只會得到下面的錯誤(”This operation must be run in a work tree”)

這個就是最好把遠端倉庫初始化成bare倉庫的原因。

這個文章寫得很詳細

一些實際中用到的操作

在遠程段10.10.0.10

添加用戶

useradd -s /usr/bin/git-shell chen  # 指定git-shell
usermod -g git chen  # 修改用戶組
passwd chen  # 修改密碼

添加項目

cd /git  # 進入git的根目錄
git init --bare ngx_luacode.git  # 創建git公共倉庫(目錄)
chown git.git ngx_luacode.git/ -R  # 修改屬主屬組
chmod 775 ngx_luacode.git/ -R  # 修改權限

git 項目添加

cd ngx_luacode.git  # 進入目錄
修改config
[core]
        repositoryformatversion = 0
        filemode = false
        bare = true
        sharedrepository = 1
[receive]
        denyNonFastforwards = true
  • 當涉及兩種系統的時候,會出現權限問題,即windows訪問,導致linux文件權限修改,git會識別權限,認為文件被修改了,所以建議修改config中的參數filemode = false
  • 當執行了git reset命令,版本回退後沒有恢復,造成本地倉庫的提交版本號落後於遠端倉庫的提交版本號。可以執行 git push -f命令去強制提交,為了防止這種操作,在配置文件中設置denyNonFastforwards = true
10.10.0.14(在本地倉庫)

拉取

git clone 用戶名@git.master.com:/git/xxxx.git
vim .git/config
filemode = false

git init 與 git init --bare 區別