如何将一个裸的git仓库推送到另一个仓库?

15
我和我们团队的其他几个人正在独立开发一个项目页面,我们称之为群组页面。在开发群组页面的同时,我们需要交换未完成的代码,而这些代码不适合发送到中央代码库。同时,在此期间,我们还要处理与群组页面无关的功能,并需要提交并推送到中央服务器。我正在寻找解决这个问题的方法,以下是我的想法,请给予评论。
我们不能在实际的代码库服务器上建立分支,因为上级领导的原因。
以下是我的想法:
1. 通过电子邮件创建并发送补丁文件,然后在需要返回群组页面时使用补丁文件来恢复代码的更改。收到电子邮件的人应用补丁文件等。 2. 我们对代码进行更改、提交,但不推送到中央服务器。然后需要该不完整代码的人可以直接从我们这里拉取。 3. 使用--bare标志创建另一个中央服务器的克隆,因此我们可以将其视为专门为群组页面服务的本地中央服务器。我们可以从中拉取代码并为群组页面创建单独的工作区。我们可以在这两个服务器之间推拉代码。
现在每种方法都存在问题。
1. 太麻烦了,我希望使用Git来解决它。 2. 当有人从我这里拉取代码并处理新功能,然后他推送到中央服务器时,他从我这里拉取的代码不会被推送到服务器。当我们完成群组页面的代码时,他该如何将代码推送到服务器? 3. 同样的问题。是否有一种方法可以从本地中央服务器向主服务器推送代码?当然这两个服务器都是Bare存储库。是否可以从一个Bare克隆向主Github Repo推送?

你可以在Bitbucket上创建一个免费的私有Git仓库,将该仓库添加到你的远程仓库中,然后在需要时提交/推送到你的GitHub仓库主分支。虽然这种方法似乎很奇怪。但是,为什么不在你的GitHub仓库上使用分支和拉取请求呢? - Matthew Blancarte
让我们只说我不被允许这样做。如果我按照你的话做了,最终能否从那个 Bit Bucket 存储库推送更改到我的主分支? - Saad Rehman Shah
你不会直接从Bitbucket推送。你会使用该仓库与团队协作。您所有人都会进行更改,将这些更改推送到Bitbucket,将这些更改拉回到本地仓库(您的计算机),然后从本地仓库向GitHub主分支推送。明白了吗? - Matthew Blancarte
最简单的解决方案(假设没有任何未明确规定的限制)是将工作推送到中央仓库,只是不要推送到主分支。实际上,只需要做到的一件事就是让不属于你组的人忽略他们不“拥有”的分支。许多Git服务器甚至具有访问控制功能,可以强制执行这一点。-- 如果有需要防止其他人看到正在进行的工作... 那么在那个时候,我会开始质疑需求和流程;很少有充分的理由这样做。 - undefined
3个回答

9

选择3是最佳选项。事实上,这正是Git的预期用法;针对单个组件的存储库在完成工作后会汇入更为中央化的存储库中。

推送别人的更改没有问题。假设你进行了修改,并将其推送到小组页面存储库中。然后我拉取它,做出一些更改,并将它们推回去。现在我们决定完成了。如果我推送到中央存储库,那么该推送将包括基于我的更改的您的更改和我的更改。

您不需要从一个裸仓库向另一个裸仓库推送。Git通过从本地仓库向一个或多个远程仓库推送来工作。当您克隆时,有一个名为“origin”的默认远程仓库。但您可以配置任意多个远程仓库。为此,请假设您已经从中央仓库克隆了;它被称为“origin”。现在您创建了一个裸仓库:位于 ssh://some-machine.corp.com/path/to/groups-repo.git。在您的本地工作仓库中,只需执行 git remote add groups ssh://some-machine.corp.com/path/to/groups-repo.git,并且您将拥有对该组仓库的引用。现在,您可以使用groupsorigin以及使用 git fetchgit pullgit push 等命令。


让我再说一遍,只是为了确保我理解了你的意思。我们有一个主分支(GitHub),我们都从这里拉取和推送代码。我们通常使用它来编写代码。在另一台机器上,我们制作了一个裸克隆的主分支,称之为“groups”。然后在我们的机器上,在不同的工作空间中从这台机器上进行克隆。现在我们有了两个不同的分支。对于所有与“groups”页面相关的编码,我们将其推送到“groups”机器并从“groups”工作空间中拉取。当我们的工作完成时,有一个人从“groups”机器上拉取代码,并按照您刚才提到的过程将其推送到GitHub。 - Saad Rehman Shah
@Caffeine 差不多了。其中一个技巧是你不需要克隆到另一个工作区。你可以在单个工作区中创建多个远程,可以使用本地分支跟踪“groups/master”,另一个跟踪“origin/master”,并随时使用git checkout在它们之间切换。如果需要,您可以使用多个工作区,但有时在一个工作区中拥有多个远程真的很方便。当你完成开发后,从组机器上拉取最新代码的人可以将其推送到主存储库。 - Brian Campbell
我不需要合并那些分支,对吗?在groups-branch上,将最终更改推送到github远程后,我只需删除此分支。当我在我的机器上执行主分支的pull操作时,组更改将被添加到其中,因为它们已经被推送到github了? - Saad Rehman Shah
@Caffeine 没错,一旦你将组合分支合并到主Github分支中,你就不需要保留组合分支(或存储库);完整的历史记录现在将在Github存储库中。是的,一旦更改被推送到Github存储库,如果你从中拉取内容,你将得到所有更改。 - Brian Campbell
不,我的意思是,如果我从未在我的机器上合并分支怎么办。问题是,负责小组页面的子团队并不真正熟悉git :) 我想找到最方便的做事方式,即使效率不高。 - Saad Rehman Shah
@Caffeine 在你工作的时候,你不需要合并分支,这是正确的。你们可以都在组分支上独立地工作,与主要工作完全无关,然后在最后,一个人可以检出主分支,执行 git merge groups/mastergit merge group-branch,然后推送到主仓库。如果主仓库和组仓库都有提交,那么你将不得不在某个时候进行合并(或拉取,这是“获取然后合并”的简写);如果只有在组仓库上进行工作,那么不需要合并,可以直接推送。 - Brian Campbell

5

有没有一种方法可以从一个裸克隆推送到主github仓库?

是的,你不必在工作树中就能从裸仓库推送更改。

只需通过ssh连接到'local master'所在的位置,然后运行:


git push origin master

正如其他答案所指出的那样,您也可以直接从本地副本推送到远程主机,但有时候使用自动化的“门卫”存储库更方便,可以通过自动化触发将更改推送到多个远程存储库,无需担心为特定个人设置ssh密钥等问题。


你能否帮忙解释如何从远程主分支拉取到本地主分支?执行 git pull origin master 时提示“必须在工作树中运行此操作”。 - SOUser
1
@SOUser,git fetch - Alexander Bird

2
简单来说,Git是一种分布式版本控制系统。这意味着无论何时你从一个存储库克隆,你都会克隆整个存储库。每个克隆都是完全独立的。实际上,你在你的机器上克隆的内容与服务器上的内容完全相同,你的克隆可以接收推送/拉取等操作。(唯一的区别可能是你不会让任何人通过ssh连接)
因此,无论你选择哪种方式,如果你的同事从你那里拉取,他们就可以将你的提交推送到主存储库。选项3也适用于相同的情况,使用你的团队Git服务器,并且当准备好时,你们中的某些人从那里拉取并从那里推送到主服务器。
所以,在你的情况下,选项3将是最简单的。虽然,一旦你推送到主存储库,这个存储库将拥有你在私人服务器上完成的所有工作。所以,我甚至不确定你是否真的需要自己的服务器(除非你想确保没有其他人触及你的“私有”分支)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接