天天看點

Ubuntu使用git來管理代碼

首先安裝:

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]