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