在本地搭建 SVN倉庫 和 git 倉庫 (倉庫僅限在本地使用)

rainbow702發表於2017-02-14

作為一名程式猿,可能大家都遇到過這種需求:

  • 自己在業餘時,出於某些目的(比如,學習、私活 ;) 等)寫了一些程式碼,想進行版本控制,以備將來不時之需。
  • 自己的一些資料,可能需要時常更新,但又想保留歷史版本(比如我自己,就有一份專門記錄所有常用密碼的txt檔案)

對於這種需求,我們自然而然的會想到一些 VCS (Version Control System)來實現。

就我自己的實踐而言,之前在使用 SVN 時,這點很好實現。大體步驟有以下幾步(以 win 系統為例說明):

下載 TortoiseSVN.exe (我的是 1.9.3 版本,如下圖),並進行安裝

TortoiseSVN

新建一個資料夾,如 test (假設 全路徑為: E:\test), 作為倉庫
test 資料夾中右鍵,選擇 Create repository here 選單,如下圖

初始化倉庫

在其他想匯出這個倉庫的地方,新建一個資料夾 123 (假設全路徑為 E:\123)。在 123 資料夾中右鍵,選擇 SVN Checkout 選單,如下圖

匯出倉庫

在彈出的對話方塊中,填入以下內容

倉庫地址&目的地資訊

然後,就可以在 123 這個資料夾中,新建&修改&刪除 檔案,並提交至 svn 進行版本控制了啊。下圖為新建檔案的示例。

新建檔案並上傳

新建檔案並上傳

新建檔案並上傳

以上就是 svn 的使用方式。


下面,說一下,目前使用很廣泛的 git 如何實現這一需求(以 CentOS 7 為例進行說明)。

確認一下 git 的版本

> git --version
git version 1.8.3.1

建立倉庫地址(假設全路徑為 /tmp/git_repo)

> mkdir /tmp/git_repo

初始化倉庫

> cd /tmp/git_repo
> git init --bare
初始化空的 Git 版本庫於 /tmp/git_repo

在想要匯出倉庫內容的地方,新建一個資料夾(假設全路徑為 /tmp/123)

> mkdir /tmp/123

匯出倉庫

> cd /tmp/123
> git clone /tmp/git_repo/ ./
正克隆到 'git_repo'...
warning: 您似乎克隆了一個空版本庫。
完成。

現在就可以往 git 倉庫裡 新建&修改&刪除 檔案了。下面以 新建檔案進行說明。

> touch readme.md

> git status
# 位於分支 master
#
# 初始提交
#
# 未跟蹤的檔案:
#   (使用 "git add <file>..." 以包含要提交的內容)
#
#   readme.md
提交為空,但是存在尚未跟蹤的檔案(使用 "git add" 建立跟蹤)
> git add .

> git commit -m "add readme.md"
[master(根提交) ad3a9d5] add readme.md
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 readme.md

> git push origin master 
Counting objects: 3, done.
Writing objects: 100% (3/3), 210 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /tmp/git_repo/
 * [new branch]      master -> master

這個時候,我們切回到 /tmp/git_repo 看下 log
PS: 其實在 /tmp/123 中看 log 也是一樣的

> cd /tmp/git_repo
> git log
commit ad3a9d5d77682dbfb846c605d609c9b5b07b9ab8
Author: xxxxxxx <yyyyyyyy@123.com>
Date:   Tue Feb 14 17:08:48 2017 +0800

    add readme.md

以上就是使用 git 來實現這一需求的過程。

最後,說一下,在使用 git 來實現的時候,有一個關鍵點,需要注意一下。那就是,當我在在初始 git倉庫 時,使用的命令:

git init --bare

當中的 –bare 這個引數千萬不能少。否則,當你在 123 中往 git_repo中提交的時候,你會得到以下的錯誤提示:

> git push origin master 
Counting objects: 29, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (28/28), 4.63 KiB | 0 bytes/s, done.
Total 28 (delta 3), reused 0 (delta 0)
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To /tmp/git_repo/
 ! [remote rejected] master -> master (branch is currently checked out)
error: 無法推送一些引用到 '/tmp/git_repo/'

相關文章