git中间存储库(作为另一个的代理)

Joh*_*son 0 git gitorious

有可能有一个git存储库(clonable和pushable)本身就是另一个远程repo的克隆?

场景:

我们为我们公司的git托管安装了一个gitorious.我们希望保持更新,但添加一些非常私有的功能(主要是部署脚本),因此需要一个可推送的项目.所需的工作流程将是:

  • 创建一个mygitorous作为一个可推的git repo
  • 将gitorious-official克隆为mygitorious(不作为子模块,如ref)
  • 用户现在可以克隆并推送mygitorious
  • 然后我可以合并mygitorious和gitorious-official来从上游更新
  • 我可以更新我部署的克隆
  • 用户可以使用合并版本更新其克隆

PS.由于这些部署脚本非常敏感,因此我不能简单地在功能上进行公共克隆并使用它.

lar*_*sks 5

当然.分布式版本控制系统背后的整个想法git就是没有存储库是"特殊的".任何存储库都可以是零个,一个或多个其他存储库的克隆或目标.

例如,假设我有一个存储库repo1.git,我可以这样做:

$ git clone --bare repo1.git repo2.git
$ git clone repo2.git repo3
$ cd repo3
$ ...make some changes and commit...
$ git push
$ cd ../repo2.git
$ git push
Run Code Online (Sandbox Code Playgroud)

如果你跟着它,你可以看到我推了repo3 - > repo2,然后是repo2 - > repo1.

回应你的评论:

您无法git checkout在裸存储库中运行.这fatal: This operation must be run in a work tree意味着什么.当您git clone成为存储库时,您会得到两件事:

  • 存储库的副本,包含在.git目录中,和
  • "工作副本"或"工作树",它是包含存储库中文件的签出副本的目录.许多命令(checkout,pull)只有在与工作副本交互时才有意义.

但是,请注意,进入非裸存储库(即具有关联工作树的存储库)是很棘手的; 没有显式配置,git会抛出错误.您会看到以下内容:

To /home/lars/tmp/so/repo
 ! [remote rejected] foo -> foo (branch is currently checked out)
error: failed to push some refs to '/home/lars/tmp/so/repo'
Run Code Online (Sandbox Code Playgroud)

这是因为如果其他人正在进行更改,那么在工作树下的存储库中发生更改将会令人惊讶.您可以在此答案中阅读更多内容.

  • *当然*如果它们位于不同的服务器上则不合适.这是一个*示例*,用于演示特定的*点*,我希望它在一个简单的命令行上是*可重现的*,而无需设置远程存储库. (2认同)