首先安裝:
sudo apt-get install git-core
sudo apt-get install openssh-server
sudo apt-get install gitosis
更改python預設版本
sudo rm /usr/bin/python
sudo ln -s python2.6 /usr/bin/python
然後:
增加名為Git的使用者,指令行禁用密碼
sudo adduser --system --shell /bin/sh --gecos 'git version control' --group --disabled-password --home /home/git git
因為git需要ssh驗證 ,是以在本地機器上生成ssh key
預設會在 ~/.ssh 下生成兩個檔案
私鑰(本地儲存) id_rsa
公鑰(上傳伺服器) id_rsa.pub
ssh-keygen -t rsa
ls ~/.ssh/
id_rsa id_rsa.pub known_hosts
上傳公鑰到USER使用者的根目錄下
scp .ssh/id_rsa.pub [email protected]_SERVER:
sudo -H -u git gitosis-init < /home/USER/id_rsa.pub
sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update
如果有密鑰,或遷移密鑰到本地,會需要下面的步驟,( 預設可忽略此步驟 )
#啟動ssh-agent,
ssh-agent
#添加id_rsa到ssh-agent
ssh-add id_rsa
到這一步,基本上都安裝好了,可以直接到本地進行測試
git clone [email protected]_SERVER:gitosis-admin.git
--------------------------
首先我們在伺服器上初始化一個git 項目:
# mkdir blog.git
# cd blog.git/
# git init --bare #一定要加上--bare,且該目錄不能有任何檔案和目錄,否則報錯:fatal: Out of memory? mmap failed: No such device
Initialized empty Git repository in /usr/local/system/repository/blog.git/
接下來我們在建立一個git 項目:
# cd ..
# mkdir test.git
# cd test.git/
# echo "some content" >> file
# git add file
fatal: Not a git repository (or any of the parent directories): .git
# git init
Initialized empty Git repository in /usr/local/system/repository/test.git/.git/
# git add file
# git commit -am "first commit"
[master (root-commit) 3ea3176] first commit
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 file
将test.git push到blog.git項目上
# git remote add origin ../blog.git
# git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 213 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To ../blog.git
* [new branch] master -> master
現在我們從blog.git中clone出來:
# cd ..
# git clone blog.git #因為我們的reposi是blog.git,clone下來後就會是blog了
Initialized empty Git repository in /usr/local/system/repository/blog/.git/
# cd blog
# ll
total 4
-rw-r--r-- 1 root root 13 Jan 4 22:09 file
可以看到項目中果然有個file檔案,是剛才我們push進去的
那麼下面我們在新clone的branch blog裡面增加一個檔案看看,
# echo 'Second file contents' > file2
# git add file2
# git commit -am'added second file'
[master 63be855] added second file
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 file2
# git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
然後我們push到blog.git
# git push
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 280 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /usr/local/system/repository/blog.git
3ea3176..63be855 master -> master
這樣的話,我們的blog.git已經有兩個檔案了file,file2
下面我們進到test.git裡面,并且将剛才在first的修改合并過來:
# cd ../test.git/
# git fetch origin
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From ../blog
3ea3176..63be855 master -> origin/master
# git merge origin/master
Updating 3ea3176..63be855
Fast forward
file2 | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 file2
我們可以看到,已經将在first的修改合并過來了,在上面的操作中我們用了fetch和merge,其實我們可以将兩個指令簡化為一個pull指令:
# git pull origin master
From ../blog
* branch master -> FETCH_HEAD
Already up-to-date.
總結一下,将版本庫拿下來的指令是pull,而将本地修改與版本庫合并的指令是push.并且push之前先要pull哦!
當然了,這些操作都是在一台機器上操作的,下面示範一下使用ssh協定連線到真正的remote 機器:
從remote上clone下來:
# git clone ssh://[email protected]/path/to/repository/blog.git
Initialized empty Git repository in /root/repository/blog/.git/
remote: Counting objects: 1055, done.
remote: Compressing objects: 100% (822/822), done.
remote: Total 1055 (delta 115), reused 1055 (delta 115)
Receiving objects: 100% (1055/1055), 1.29 MiB | 19 KiB/s, done.
Resolving deltas: 100% (115/115), done.
# ll
總計 4
drwxr-xr-x 17 root root 4096 01-05 20:57 blog
然後,當我們在本地做了修改,想要送出到remote的時候,我們就可以直接push了:
# cd blog/
# git push
Everything up-to-date
這樣就基本OK了!
送出之後,在另外一個用戶端通過git pull 就可以更新到代碼了。
附上參考資料:
[url]http://www.stylejar.com/archives/ubuntu_install_git_server.html[/url]
[url]http://xf986321.iteye.com/blog/702974[/url]
[url]http://www.linuxsir.org/bbs/thread281294.html[/url]
git原理[url]http://www.iteye.com/topic/732199[/url]