将本地仓库推送到远程仓库的新子目录中

18

我有一个本地的git仓库,已经使用了几个月。现在这个工作将成为一个更大项目的一部分,这个项目有一个已存在的仓库,所以我想将这个项目的服务器作为远程仓库,并将我的工作推送到该仓库的子目录中。

然而,我担心这样做会把我的本地仓库推送到更大项目的顶层目录:

$ pwd
/home/yotommy/my-local-project
$ git remote add origin git://example.com/gitscn/larger-project.git
$ git push origin master ### goes to top-level directory, not desired!

我尝试指定一个(尚不存在的)子目录:

$ git remote add origin git://example.com/gitscm/larger-project.git/my/sub/dir
$ git push origin master
fatal: '/gitscm/larger-project.git/my/sub/dir' does not appear to be a git repository

我应该先将子目录添加到大型项目存储库中吗?还是有更好的方法?


1
请查看git-submodule。你想要的现状是不可能实现的(而且在版本控制逻辑中也没有意义)。 - Simon Boudrias
谢谢,我会查看git-submodule。我的目标是将我的代码及其所有历史记录集成到更大的项目存储库中。这个目标是没有意义的,还是我的方法不对? - yotommy
5
@SimonBoudrias,实际上,他想要的是完全可行的(我已经做过几次),但不简单且不直观,并且至少有两种不同的主要方法 - 一种使用git subtree,另一种使用git merge -s subtree,这两个方法都可以在谷歌上轻易找到 - 还有一种基于低层次的方法,使用git read-tree和其他管道命令,请参考此链接 - twalberg
啊,也许我没有理解正确。@yotommy,在合并之后,您不希望继续在自己的存储库中工作,而是始终从更大的项目中工作? - Simon Boudrias
正确的,@SimonBoudrias,我认为这就像是从我的本地仓库移动到一个更大项目的子目录。 - yotommy
@twalberg,这些是很好的线索。正在调查中。 - yotommy
1个回答

7

在@twalberg的引导下,我找到了子树合并的文档。以下是针对问题场景的简化步骤。

$ git clone git://example.com/gitscm/larger-project.git
$ git remote add subproj_remote /home/yotommy/my-local-project
$ git fetch subproj_remote
warning: no common commits
remote: Counting objects: 461, done.
remote: Compressing objects: 100% (332/332), done.
remote: Total 461 (delta 157), reused 0 (delta 0)
Receiving objects: 100% (461/461), 272.89 KiB, done.
Resolving deltas: 100% (157/157), done.
From subproj_remote /home/yotommy/my-local-project
 * [new branch]      master     -> subproj_remote/master
$ git checkout -b subproj_branch subproj_remote/master
Branch subproj_branch set up to track remote branch master from subproj_remote.
Switched to a new branch 'subproj_branch'
$ git checkout master
Switched to branch 'master'
$ git read-tree --prefix=subproj/ -u subproj_branch
$ git commit -m "merged subproj"

我有点困惑。在子项目得到新提交的情况下,如何将更新推送到更大的项目分支? - mr.buttons
1
在您提供的链接中找到了答案:git merge -s subtree <跟踪“真实”文件夹的本地分支> - mr.buttons
如果git提示存在不相关的历史记录,我发现使用git merge -s subtree <local_branch> --allow-unrelated-histories可以解决这个问题。 - undefined

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