使用 git 作为中央存储库

使用 git 作为中央存储库

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

但是,我的开发机器中只有一台有静态 IP。我的大脑卡在 CVS 模式,所以我尝试设置 git,让那台机器成为“中央”服务器,其他所有机器都从该服务器提取数据。

这类工作。我有一堆机器 AC,它们从“主” M 执行 git-pull。它们执行 git push 以将数据发回。

如果我在主服务器上进行开发,就会出现问题。首先,如果不执行以下代码,我不知道如何让中央仓库提供最新版本:

git reset --hard HEAD

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

我的思维模型有些问题。帮忙吗?

答案1

您希望您的中央存储库是裸露的。假设它所在的机器名为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 错误一样。(这有点像svn update,但更灵活和强大。)

现在将它放入你的中央主机:

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

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

答案2

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

答案3

这个答案类似于gbacon 的答案,但采用的方法是您已经拥有本地存储库设置,并希望创建一个被视为中央存储库的远程主存储库。这只是从不同的方法中添加细节。

我使用 git 来存储我的 dot-config 文件。我从我认为的“中央存储库”中推送和拉取文件。通过多台计算机重置我的所有 dot 文件非常方便。

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

这会在 repo 站点上创建了一个空的裸 repo。

现在,如果我本地已经有现有的 repo,我可以将其推送到远程站点。

$ cd ~/src/dotconf

chdir 进入本地目录。

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

将远程存储库添加为原点,因此推送/拉取将对该存储库进行操作。

$ git push origin master

将我的主控推送到原点(如之前通过 git remote 标记的一样)。现在,远程仓库被视为我的“中央仓库”。我的所有 git push/pull 都将与原点交互。

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

$ 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就不会抱怨您不够具体。另一种选择是将您的主分支设置为--track远程源。如果您有多个分支,这很有用。

答案4

我今天刚刚研究了同样的问题。这个博客邮政关于这个问题有很多讨论,但大多数人的意见是按照 Manni 所说的去做。查看 David French 的帖子下的评论,了解其他一些可能性,包括如果您最终错误地将工作推送到索引或工作树中未提交工作的存储库,该怎么办。“git reset –soft HEAD^”将撤消已推送的更改,而不会干扰您的工作。

相关内容