[英]Ansible: how to init git bare repository and clone it to the same machine?
[英]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.