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

git中间存储库(作为另一个存储库的代理),git,gitorious,Git,Gitorious,git存储库(可克隆和可推送)本身是否可能是另一个远程repo的克隆 情景: 我们为公司的git主机安装了gitorious。我们希望保持更新,但添加一些非常私有的特性(主要是部署脚本),因此需要一个可推式项目。理想的工作流程是: 创建MyGitOrient作为可推式git回购 将gitorious official克隆到mygitorious(不作为子模块,作为参考) 用户现在可以克隆和推送mygitorious 然后,我可以将mygitorious与gitorious official合并

git存储库(可克隆和可推送)本身是否可能是另一个远程repo的克隆

情景:

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

  • 创建MyGitOrient作为可推式git回购
  • 将gitorious official克隆到mygitorious(不作为子模块,作为参考)
  • 用户现在可以克隆和推送mygitorious
  • 然后,我可以将mygitorious与gitorious official合并,从上游进行更新
  • 我可以更新已部署的克隆
  • 用户可以使用合并版本更新克隆

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

当然。像
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
。这就是致命的:此操作必须在工作树中运行。当您
git clone
a存储库时,您会得到两件事:

  • 存储库的副本,包含在
    .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'
这是因为,如果有其他人进入您的工作树,那么在您的工作树下的存储库中发生更改将是令人惊讶的。你可以读更多
当然可以。像
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
。这就是致命的:此操作必须在工作树中运行。当您
git clone
a存储库时,您会得到两件事:

  • 存储库的副本,包含在
    .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'
这是因为,如果有其他人进入您的工作树,那么在您的工作树下的存储库中发生更改将是令人惊讶的。你可以读更多
在。

中,虽然这适用于多个本地回购,但如果它们位于不同的服务器上,
cd
步骤不合适。但总的来说,这一点仍然是正确的——这是一个信任的网络。当然,如果它们位于不同的服务器上,这是不合适的。这是一个演示特定点的示例,我希望它可以在简单的命令行中重现,而无需设置远程存储库。@larks谢谢。对于我的特殊情况,repo2已经由gitorious创建为空的远程repo。我尝试了
git add remote…
fetch
(确定),但签出失败。我不确定我是否可以删除和克隆。有任何提示吗?
远程添加
获取
成功,但
签出
失败?您能发布您正在使用的命令和您看到的确切输出吗?@larska,对于任何误解,我深表歉意。虽然这对于多个本地回购是正确的,但如果它们位于不同的服务器上,
cd
步骤是不合适的。但总的来说,这一点仍然是正确的——这是一个信任的网络。当然,如果它们位于不同的服务器上,这是不合适的。这是一个演示特定点的示例,我希望它可以在简单的命令行中重现,而无需设置远程存储库。@larks谢谢。对于我的特殊情况,repo2已经由gitorious创建为空的远程repo。我尝试了
git add remote…
fetch
(确定),但签出失败。我不确定我是否可以删除和克隆。有任何提示吗?
远程添加
获取
成功,但
签出
失败?你能发布你正在使用的命令和你看到的确切输出吗?@larska,为任何误解道歉。