使用git作为中央存储库


12

我已经设置了git供我自己使用-因此我可以从“任何地方”访问一个项目,并且如果我恰好在这里的X部分和在这里的Y部分上工作,可以保持版本安全,并且可以在必要时进行合并。

但是,我只有一台开发机具有静态IP。我的大脑陷入了CVS模式,因此我尝试设置git,以使该计算机成为“中央”服务器,所有其他服务器都来自该服务器。

这类作品。我有一堆机器AC,它们从“ master” M进行git-pull。它们进行git push将数据发送回去。

如果我在母版上进行开发,就会出现问题。首先,我不知道如何不进行任何操作就如何获取中央存储库以提供最新版本

git reset --hard HEAD

这似乎有点过分。而且,如果我在重置之前在中央计算机上进行开发,则不确定如何将其与已经推送的更改合并。

关于我的心理模型的事情还遥遥无期。救命?


当您说“ master”时,您是在谈论master存储库还是master分支?
innaM

主存储库
Alex Feinman

1
git上下文中的“ master”通常是默认分支的名称。
innaM

这可能属于SO
Ken Liu

Answers:


30

您希望裸露的中央存储库。假设它所在的机器名为static

$ ssh static git init --bare /git/myproject.git

这个光秃秃的存储库是一个重要的集合点:用于推入和拉出而不是开发。

在中央存储库的克隆上进行开发:

$ cd ~/src
$ git clone static:/git/myproject.git

即使您在static,也可以在克隆中工作:

$ git clone /git/myproject.git

尽管您是唯一在此存储库上工作的人,但要养成在git文档称为主题分支上进行工作的习惯。这样的直接好处是它保持了干净的母版,即您始终可以从中央母版分支拉入当前本地存储库的母版而无需合并。

例如:

$ git checkout -b fix-bug-in-foo
$ hack
$ git add file.c file.h
$ git commit -m "Fix ..."

这似乎没什么大不了,但是它使您可以自由地将分支上表示的项目保留部分熟透的状态,或者如果您的绝妙主意是失败的,则可以轻松地放弃该分支而不必破坏项目中已经在其他分支上工作的任何其他内容。无限的免费民兵!

也许那天晚上您回家并添加了新功能。第二天早上,你

$ git checkout master
$ git pull

更新本地母版以反映中央存储库中的内容。

但现在说您已经修复了foo错误,并准备将其包含在master分支中。首先,您要将其与昨晚的更改集成在一起:

$ git checkout fix-bug-in-foo
$ git rebase master

rebase命令使您的存储库看起来就像您在昨晚的新功能之上修复了foo bug一样。(这有点像svn update,但更加灵活和强大。)

现在将其放入您的中央主机中:

$ git checkout master
$ git merge fix-bug-in-foo
$ git push origin master

我们一直将master视为特殊,但这只是常规。您可以static轻松地通过git存储库在不同存储库的不同分支上共享工作。


1
令人敬畏的答案,确定了当前的所有问题。
Dan Loewenherz,2009年

我的git安装不接受--bare作为git init(旧版本?)的选项,但我通过克隆--bare我现有的存储库来解决此问题,然后再手动编辑配置文件。
亚历克斯·费曼2009年

如果您正在运行git 1.6.4.x,则git init --bare没有其他参数。如果设置,它将使用当前工作目录或GIT_DIR环境设置。我相信您需要git 1.6.5.x才能接受目录参数。
达伦·霍尔

4
这是到目前为止我正在做的工作中最好的git工作流说明。
格雷格·格雷厄姆

8

如果您有一个带有中央git存储库的中央服务器,那么该存储库应该是一个bare存储库。裸存储库中没有文件的工作副本。因此,如果您在该中央计算机上工作,则不会直接使用中央存储库,而是使用本地克隆。


6

此答案与gbacon的答案类似,但是采用的方法是您已经具有本地回购设置,并且想要创建一个被视为中央回购的远程主服务器。它只是添加了不同方法的细节。

我使用git存储我的dot-config文件。我从所谓的“中央回购”中抽出资金。通过多台计算机重置所有点文件非常方便。

$ ssh example.com
$ mkdir dotconf.git && cd dotconf.git
$ git init --bare
$ exit

这在回购站点上创建了一个空的裸回购。

现在,如果我已经在本地拥有一个现有的存储库,则可以将其推送到远程站点。

$ cd ~/src/dotconf

chdir进入本地目录。

$ git remote add origin ssh://example.com/~/dotconf.git

将远程存储库添加为源,因此推/拉将对该存储库起作用。

$ git push origin master

将我的主服务器推到原点(如先前通过git remote标记的)。现在,该远程回购被视为我的“中央回购”。我所有的git push / pull都将与原点交互。

如果我转到另一台主机,则可以轻松地通过该存储库的克隆将其拉到新位置。

$ git clone ssh://example.com/~/dotconf.git

如果要在远程服务器上进行开发,请先克隆,然后再推/拉回裸仓库。

$ cd ~/src
$ git clone ~/dotconf.git
$ cd ~/src/dotconf
  * do coding *
$ git push
  * check in from another location *
$ git pull

您可能必须进行设置,git config --add branch.master.remote origin以免git pull抱怨自己不够具体。另一种选择是将您的master分支设置--track为远程源。如果您有多个分支,则很有用。


1

我今天只是在研究同样的问题。这篇博客文章对此问题进行了很多讨论,但是大多数人的意见是按照曼尼所说的去做。看看David French在帖子中的评论还有其他可能性,包括如果您最终错误地推送到索引或工作树中未提交工作的存储库,该怎么办。“ git reset –soft HEAD ^”将在不影响您的工作的情况下取消推送的更改。


2
该博客文章的一个问题是跳过索引的用途。这是一篇很好的文章,解释了如何使用git而不是git进行工作-osteele.com/archives/2008/05/my-git-workflow-包含工作流图。
达伦·霍尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.