簡體   English   中英

你如何使用“git --bare init”存儲庫?

[英]How do you use “git --bare init” repository?

我需要創建一個中央Git存儲庫,但我有點困惑......

我創建了一個裸存儲庫(在我的git服務器,機器2中):

$ mkdir test_repo
$ git --bare init

現在我需要將文件從我的本地存儲庫(機器1)推送到裸存儲庫(機器2)。 我可以通過SSH訪問機器2。 問題是,我認為我不理解裸存儲庫的概念......

將我的代碼存儲在裸存儲庫中的正確方法是什么? 如何將更改從本地存儲庫推送到裸存儲庫?

擁有中央存儲庫以獲得裸存儲庫的正確方法是什么?

我對這個問題有點困惑。 請給我一個線索。

首先,只需要檢查,您需要在運行git init --bare之前切換到您創建的目錄。 另外,給裸存儲庫提供擴展名.git是常規的。 所以你可以做到

git init --bare test_repo.git

對於Git版本<1.8,你會這樣做

mkdir test_repo.git
cd test_repo.git
git --bare init

為了回答你以后的問題,裸存儲庫(根據定義)沒有附加工作樹,所以你不能像在普通的非裸存儲庫中那樣輕松地向它們添加文件(例如使用git add <file>以及隨后的git commit 。)

您幾乎總是通過從另一個存儲庫git push (使用git push )來更新裸存儲庫。

請注意,在這種情況下,您需要首先允許人們推送到您的存儲庫。 當在test_repo.git里面test_repo.git ,做

git config receive.denyCurrentBranch ignore

社區編輯

git init --bare --shared=group

正如prasanthv所評論的那樣,如果你在工作中這樣做,這是你想要的,而不是私人住宅項目。

我正在添加這個答案,因為在到達這里之后(使用相同的問題),沒有一個答案真正描述了從無到有,到完全可用的遠程(裸)回購所需的所有必需步驟。

注意:此示例使用本地路徑作為裸存儲庫的位置,但其他git協議(如OP指示的SSH)應該可以正常工作。

我試圖為那些不熟悉git的人添加一些注釋。

1.初始化裸露的回購......

> git init --bare /path/to/bare/repo.git
Initialised empty Git repository in /path/to/bare/repo.git/

這將創建一個文件夾(repo.git)並使用代表git repo的git文件填充它。 就目前而言,這個回購無用 - 它沒有提交,更重要的是沒有分支 雖然您可以克隆此回購,但您無法從中獲取。

接下來,我們需要創建一個工作文件夾。 有兩種方法可以執行此操作,具體取決於您是否有現有文件。

2A。 通過克隆空倉庫創建一個新的工作文件夾(沒有現有文件)

git clone /path/to/bare/repo.git /path/to/work
Cloning into '/path/to/work'...
warning: You appear to have cloned an empty repository.
done.

僅當/path/to/work不存在或者為空文件夾時,此命令才有效。 注意警告 - 在這個階段,你仍然沒有任何有用的東西。 如果你cd /path/to/work並運行git status ,你會得到類似的東西:

On branch master

Initial commit

nothing to commit (create/copy files and use "git add" to track)

但這是謊言。 你不是真的在分支master (因為git branch什么都沒有返回),到目前為止,沒有提交。

接下來,復制/移動/創建工作文件夾中的一些文件,將它們添加到git並創建第一個提交。

> cd /path/to/work
> echo 123 > afile.txt
> git add .
> git config --local user.name adelphus
> git config --local user.email adelphus@example.com
> git commit -m "added afile"
[master (root-commit) 614ab02] added afile
 1 file changed, 1 insertion(+)
 create mode 100644 afile.txt

只有你還沒有告訴git你是誰,才需要git config命令。 請注意,如果您現在運行git branch ,您現在將看到列出的master分支。 現在運行git status

On branch master
Your branch is based on 'origin/master', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

nothing to commit, working directory clean

這也是誤導性的 - 上游沒有“消失”,它還沒有被創建,而git branch --unset-upstream也無濟於事。 但是沒關系,現在我們有了第一次提交,我們可以在裸倉庫上創建push和master。

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

此時,我們有一個功能齊全的裸倉庫,可以在主分支上的其他地方克隆,也可以在本地工作副本中進行拉動和推送。

> git pull
Already up-to-date.
> git push origin master
Everything up-to-date

2B。 從現有文件創建工作文件夾如果您已經有一個包含文件的文件夾(因此無法克隆到該文件夾​​中),您可以初始化一個新的git repo,添加第一個提交,然后將其鏈接到裸存儲庫。

> cd /path/to/work_with_stuff
> git init 
Initialised empty Git repository in /path/to/work_with_stuff
> git add .
# add git config stuff if needed
> git commit -m "added stuff"

[master (root-commit) 614ab02] added stuff
 20 files changed, 1431 insertions(+)
 create mode 100644 stuff.txt
...

此時,我們有第一個提交和一個本地主分支,我們需要將其轉變為遠程跟蹤的上游分支。

> git remote add origin /path/to/bare/repo.git
> git push -u origin master
Counting objects: 31, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (31/31), done.
Writing objects: 100% (31/31), 43.23 KiB | 0 bytes/s, done.
Total 31 (delta 11), reused 0 (delta 0)
To /path/to/bare/repo.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

注意git push上的-u標志來設置(新)跟蹤的上游分支。 和以前一樣,我們現在擁有一個功能齊全的裸倉庫,可以在主分支上的其他地方克隆,也可以在本地工作副本中進行拉動和推送。

所有這一切對某些人來說似乎是顯而易見的,但是git在最好的時候會讓我困惑(它的錯誤和狀態信息真的需要一些返工) - 希望這會對其他人有所幫助。

逐一回答你的問題:

裸存儲庫是沒有工作樹的存儲庫。 這意味着它的全部內容就是.git目錄中的內容。

您只能通過從本地克隆中push送到裸存儲庫來commit裸存儲庫。 它沒有工作樹,因此沒有修改文件,也沒有修改。

擁有中央存儲庫是擁有bare存儲庫的唯一方法。

你也可以讓git為你創建目錄:

git init --bare test_repo.git

通常的做法是將中央存儲庫作為一個裸倉庫推送。

如果你有SVN背景,你可以將SVN repo與Git裸倉庫聯系起來。 它沒有原始格式的repo中的文件。 而您的本地倉庫將具有形成您的“代碼”的文件。

您需要從本地倉庫向裸倉庫添加一個遙控器並將“代碼”推送到它。

它將是這樣的:

git remote add central <url> # url will be ssh based for you
git push --all central

這應該足夠了:

git remote add origin <url-of-bare-repo>
git push --all origin

有關詳細信息,請參閱“ GIT:如何更新我的裸倉庫? ”。
筆記:

  • 對於裸倉庫遠程引用,您可以使用與“ origin ”不同的名稱。
  • 這不會推動你的標簽,你需要一個單獨的git push --tags origin

基於Mark Longair和Roboprog的答案:

如果git版本> = 1.8

git init --bare --shared=group .git
git config receive.denyCurrentBranch ignore

要么 :

如果git版本<1.8

mkdir .git
cd .git
git init --bare --shared=group 
git config receive.denyCurrentBranch ignore

很高興驗證您推送的代碼實際上已提交。

您可以通過使用--relative選項顯式設置路徑來獲取裸存儲庫上的更改日志。

$ cd test_repo
$ git log --relative=/

這將顯示已提交的更改,就好像這是一個常規的git repo。

--bare標志創建一個沒有工作目錄的存儲庫。 裸存儲庫是中央存儲庫,您無法在此編輯(存儲)代碼以避免合並錯誤。

例如,當您在本地存儲庫(計算機1)中添加文件並將其推送到裸存儲庫時,您無法在裸存儲庫中看到該文件,因為它始終為“空”。 但是,您確實將某些內容推送到存儲庫,您可以通過克隆服務器中的另一個存儲庫(機器2)來明確地看到它。

機器1中的本地存儲庫和機器2中的“復制”存儲庫都是非裸機。 裸存儲庫和非裸存儲庫之間的關系

博客將幫助您理解它。 https://www.atlassian.com/git/tutorials/setting-up-a-repository

您可以執行以下命令來初始化本地存儲庫

mkdir newProject
cd newProject
touch .gitignore
git init
git add .
git commit -m "Initial Commit"
git remote add origin user@host:~/path_on_server/newProject.git
git push origin master

您應該從本地存儲庫處理項目,並將服務器用作中央存儲庫。

您還可以按照本文解釋創建和維護Git存儲庫的每個方面。 Git for Beginners

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM