使用 git 作为中央存储库

Ale*_*man 12 git

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

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

这样的作品。我有一堆机器 AC,它们从“主”M 执行 git-pull 操作。他们执行 git pushes 以将数据发回。

如果我在 master 上进行开发,问题就会出现。首先,我不知道如何让中央仓库提供最新版本而不做

git reset --hard HEAD
Run Code Online (Sandbox Code Playgroud)

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

关于我的心智模型的某些事情离我很远。帮助?

小智 31

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

$ ssh static git init --bare /git/myproject.git
Run Code Online (Sandbox Code Playgroud)

这个裸存储库是一个中心集合点:它用于推入和拉出,而不是开发。

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

$ cd ~/src
$ git clone static:/git/myproject.git
Run Code Online (Sandbox Code Playgroud)

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

$ git clone /git/myproject.git
Run Code Online (Sandbox Code Playgroud)

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

例如:

$ git checkout -b fix-bug-in-foo
$ hack
$ git add file.c file.h
$ git commit -m "Fix ..."
Run Code Online (Sandbox Code Playgroud)

这可能看起来没什么大不了的,但它使您可以自由地将那个分支上表示的项目保持在部分成熟的状态,或者如果您的酷想法失败了,您可以轻松地丢弃该分支,而无需破坏项目中已经在其他分支上工作的任何其他内容。无限免费调度!

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

$ git checkout master
$ git pull
Run Code Online (Sandbox Code Playgroud)

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

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

$ git checkout fix-bug-in-foo
$ git rebase master
Run Code Online (Sandbox Code Playgroud)

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

现在让它进入你的中央主:

$ git checkout master
$ git merge fix-bug-in-foo
$ git push origin master
Run Code Online (Sandbox Code Playgroud)

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

  • 这是迄今为止我所看到的关于我正在做的工作的最好的 git 工作流程解释。 (4认同)

inn*_*naM 8

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


Dar*_*all 6

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

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

$ ssh example.com
$ mkdir dotconf.git && cd dotconf.git
$ git init --bare
$ exit
Run Code Online (Sandbox Code Playgroud)

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

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

$ cd ~/src/dotconf
Run Code Online (Sandbox Code Playgroud)

chdir 进入本地目录。

$ git remote add origin ssh://example.com/~/dotconf.git
Run Code Online (Sandbox Code Playgroud)

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

$ git push origin master
Run Code Online (Sandbox Code Playgroud)

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

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

$ git clone ssh://example.com/~/dotconf.git
Run Code Online (Sandbox Code Playgroud)

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

$ cd ~/src
$ git clone ~/dotconf.git
$ cd ~/src/dotconf
  * do coding *
$ git push
  * check in from another location *
$ git pull
Run Code Online (Sandbox Code Playgroud)

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