我正在使用Git的子树命令将一些库拉入项目中。
如果我以正常的方式克隆项目,我最终得到了我需要的所有代码,但是我丢失了子树关系 - 在克隆中,每个库都没有远程,并且没有 - 推送其中任何一个的分支。
重建此连接的最佳方法是什么?
完成
是否足够git remote add <lib> <remote-url>
git fetch <lib>
如果我是第一次添加该库,我会遵循:
git subtree add -P <local/lib> --squash "<lib>/master"
当本地目录已经存在时,这不起作用,当然,当你克隆了一个已经添加了库的项目时,它就会出现。
在这种情况下还有什么应该做的,以确保后续的git子树合并和git子树分割命令到预期的东西?
答案 0 :(得分:9)
我有类似的问题
以下是我首先创建子树的方法
git remote add -f sub_project url_to_remote_repository/project.git
git merge -s ours --no-commit sub_project/master
git read-tree --prefix=sub/project/ -u sub_project/master
git commit -m "Added subtree merged in sub/project"
并从“项目”回购中获取更改,我正在做
git pull -s subtree sub_project master
现在,我将本地存储库推送到github 从另一台机器我克隆了我的github存储库 那时,我得到了子/项目中所有预期的文件......所以这很好。 但不再是遥远的,与子/项目的关系。 所以我做了以下
git remote add -f sub_project url_to_remote_repository/project.git
git merge -s ours --no-commit --squash sub_project/master
git pull -s subtree sub_project master
这很好。现在,我能够像以前一样从该克隆的存储库中管理子树
git pull -s subtree sub_project master
注意:
1)在我们的项目中,在我们使用git子模块之前,这对我们的用户来说真的不好。这就是我们切换到git的子树系统的原因 2)在Windows机器上执行这些操作(使用git版本1.7.9.msysgit.0)时,我遇到了一些奇怪的错误,并且在linux上成功完成了相同的操作。 所以现在,为了操作子树,我经常使用linux(如果我有任何错误,我在linux上尝试相同)。
希望这可以提供帮助。
答案 1 :(得分:3)
我过去的方式重新创建了这种关系是通过子树合并。
git pull -s subtree <lib> master
即使没有任何东西要合并/拉,它应该只是返回而不做任何事情。您可以随意将--squash
添加到上面的拉动中,这样就不会拉入任何远程历史记录。
答案 2 :(得分:0)
我在将项目从使用子模块迁移到子树时遇到了这个问题,但最终都没有使用(至少不是直接使用) - 我现在正在使用git-subrepo工具。
它通过在每个子树的根处添加.gitrepo文件来解决此问题。 .gitrepo文件包含跟踪信息,包括远程URL,然后包含在后续克隆中。这真的简化了事情,唯一的复杂因素是必须在每台开发机器上单独安装git-subrepo(尽管没有它,存储库仍然可用)。