0

是否可以让 git 存储库(可克隆和可推送)本身成为另一个远程存储库的克隆?

场景:

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

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

PS。由于这些部署脚本非常敏感,我不能简单地在 gitorious 中创建一个公共克隆并使用它。

4

1 回答 1

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

如果你跟着它,你可以看到我推了 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'

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

于 2012-05-11T15:43:24.083 回答