克隆使用子树的Git repos的过程

时间:2010-07-08 10:30:10

标签: git subtree

我正在使用Git的子树命令将一些库拉入项目中。

如果我以正常的方式克隆项目,我最终得到了我需要的所有代码,但是我丢失了子树关系 - 在克隆中,每个库都没有远程,并且没有 - 推送其中任何一个的分支。

重建此连接的最佳方法是什么?

完成

是否足够
git remote add <lib> <remote-url>
git fetch <lib>

如果我是第一次添加该库,我会遵循:

git subtree add -P <local/lib> --squash "<lib>/master"

当本地目录已经存在时,这不起作用,当然,当你克隆了一个已经添加了库的项目时,它就会出现。

在这种情况下还有什么应该做的,以确保后续的git子树合并和git子树分割命令到预期的东西?

3 个答案:

答案 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(尽管没有它,存储库仍然可用)。