你如何使用"git --bare init"存储库?

And*_*dré 295 git

我需要创建一个中央Git存储库,但我有点困惑......

我创建了一个裸存储库(在我的git服务器,机器2中):

$ mkdir test_repo
$ git --bare init
Run Code Online (Sandbox Code Playgroud)

现在我需要将文件从我的本地存储库(机器1)推送到裸存储库(机器2).我可以通过SSH访问机器2.问题是,我认为我不理解裸存储库的概念......

将我的代码存储在裸存储库中的正确方法是什么?如何将更改从本地存储库推送到裸存储库?

拥有中央存储库以获得裸存储库的正确方法是什么?

我对这个问题有点困惑.请给我一个线索.

Mar*_*air 367

首先,只需要检查,您需要在运行之前切换到您创建的目录git init --bare.此外,通常给裸存储库提供扩展.git.所以你可以做到

git init --bare test_repo.git
Run Code Online (Sandbox Code Playgroud)

对于Git版本<1.8,你会这样做

mkdir test_repo.git
cd test_repo.git
git --bare init
Run Code Online (Sandbox Code Playgroud)

为了回答你以后的问题,裸存储库(根据定义)没有附加工作树,所以你不能像在普通的非裸存储库中那样轻松地向它们添加文件(例如,使用git add <file>和后续版本)git commit. )

您几乎总是通过git push从另一个存储库推送(使用)来更新裸存储库.

请注意,在这种情况下,您需要首先允许人们推送到您的存储库.在里面test_repo.git,做

git config receive.denyCurrentBranch ignore
Run Code Online (Sandbox Code Playgroud)

社区编辑

git init --bare --shared=group
Run Code Online (Sandbox Code Playgroud)

正如prasanthv所评论的那样,如果你在工作中这样做,这是你想要的,而不是私人住宅项目.

  • 我认为这三行与只有一行具有相同的效果:git --bare init test_repo.git至少我当前的git版本(1.8.2.2) (14认同)
  • 如果你计划让其他人推送到这个仓库,你也可以为`init`添加`--shared`选项.它会自动将组写入权限添加到存储库 - [link](http://git-scm.com/book/en/Git-on-the-Server-Getting-Git-on-a-Server) (7认同)
  • 如果您想了解裸仓库和非裸仓库之间的区别,则很有用http://stackoverflow.com/questions/7861184/what-is-the-difference- Between-git-init-and-git-init-bare (2认同)

ade*_*hus 225

我正在添加这个答案,因为在到达这里之后(使用相同的问题),没有一个答案真正描述了从无到有,到完全可用的远程(裸)回购所需的所有必需步骤.

注意:此示例使用本地路径作为裸存储库的位置,但其他git协议(如OP指示的SSH)应该可以正常工作.

我试图为那些不熟悉git的人添加一些注释.

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

> git init --bare /path/to/bare/repo.git
Initialised empty Git repository in /path/to/bare/repo.git/
Run Code Online (Sandbox Code Playgroud)

这将创建一个文件夹(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.
Run Code Online (Sandbox Code Playgroud)

此命令仅在/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)
Run Code Online (Sandbox Code Playgroud)

但这是谎言.你不是真的在分支上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
Run Code Online (Sandbox Code Playgroud)

git config只有你还没有告诉git你是谁,才需要这些命令.请注意,如果您现在运行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
Run Code Online (Sandbox Code Playgroud)

这也是误导性的 - 上游没有"消失",它还没有被创造出来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
Run Code Online (Sandbox Code Playgroud)

此时,我们有一个功能齐全的裸仓库,可以在主分支上的其他地方克隆,也可以在本地工作副本中进行拉动和推送.

> git pull
Already up-to-date.
> git push origin master
Everything up-to-date
Run Code Online (Sandbox Code Playgroud)

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
...
Run Code Online (Sandbox Code Playgroud)

此时,我们有第一个提交和一个本地主分支,我们需要将其转变为远程跟踪的上游分支.

> 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.
Run Code Online (Sandbox Code Playgroud)

注意-ugit push上的标志来设置(新)跟踪的上游分支.和以前一样,我们现在拥有一个功能齐全的裸仓库,可以在主分支上的其他地方克隆,也可以在本地工作副本中进行拉动和推送.

所有这一切对某些人来说似乎是显而易见的,但是git在最好的时候会让我困惑(它的错误和状态信息真的需要一些返工) - 希望这会对其他人有所帮助.

  • 这个答案解决了我的问题,应该是公认的答案,希望越来越多的人可以投票. (12认同)
  • 你应该为这样的答案收钱 (11认同)
  • 有趣.当然比我的答案更详细.+1 (4认同)
  • 作为一个新的git用户,这个答案对我非常有帮助,谢谢你写这个! (2认同)
  • 这是一个绝妙的答案。对我们单位有很大帮助。 (2认同)

Mar*_*Gil 33

逐一回答你的问题:

裸存储库是没有工作树的存储库.这意味着它的全部内容就是你在.git目录中的内容.

您只能commit通过push本地克隆来存储存储库.它没有工作树,因此没有修改文件,也没有修改.

拥有中央存储库是拥有存储库的唯一方法bare.


Ser*_* S. 21

你也可以让git为你创建目录:

git init --bare test_repo.git
Run Code Online (Sandbox Code Playgroud)


man*_*lds 20

通常的做法是将中央存储库作为一个裸仓库推送.

如果你有SVN背景,你可以将SVN repo与Git裸仓库联系起来.它没有原始格式的repo中的文件.而您的本地仓库将具有形成您的"代码"的文件.

您需要从本地仓库向裸仓库添加一个遥控器并将"代码"推送到它.

它将是这样的:

git remote add central <url> # url will be ssh based for you
git push --all central
Run Code Online (Sandbox Code Playgroud)


Von*_*onC 17

这应该足够了:

git remote add origin <url-of-bare-repo>
git push --all origin
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅" GIT:如何更新我的裸仓库? ".
笔记:

  • origin对于裸仓库远程引用,您可以使用与' ' 不同的名称.
  • 这不会推动你的标签,你需要单独git push --tags origin的.


小智 5

很高兴验证您推送的代码实际上已提交.

您可以通过使用--relative选项显式设置路径来获取裸存储库上的更改日志.

$ cd test_repo
$ git log --relative=/
Run Code Online (Sandbox Code Playgroud)

这将显示已提交的更改,就好像这是一个常规的git repo.


Jac*_*ck' 5

根据Mark Longair和Roboprog的回答:

如果git版本> = 1.8

git init --bare --shared=group .git
git config receive.denyCurrentBranch ignore
Run Code Online (Sandbox Code Playgroud)

要么 :

如果git版本<1.8

mkdir .git
cd .git
git init --bare --shared=group 
git config receive.denyCurrentBranch ignore
Run Code Online (Sandbox Code Playgroud)