15

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

如果我然后以正常方式克隆项目,我最终得到了我需要的所有代码,但我失去了子树关系 - 在克隆中,每个库都没有远程,也没有 -push 分支的任何一方。

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

做就够了吗

git remote add <lib> <remote-url>
git fetch <lib>

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

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

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

在这种情况下还应该做些什么,以确保后续的 git subtree merge 和 git subtree split 命令达到预期的效果?

4

3 回答 3

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 存储库那时,我在 sub/project 中获得了所有预期的文件......所以这很棒。但不再遥远,与子/项目的关系。所以我做了以下

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 上尝试同样的方法)。

希望这能有所帮助。

于 2012-07-02T15:37:36.387 回答
4

我过去重建这种关系的方式是进行子树合并。

git pull -s subtree <lib> master

即使没有什么可以合并/拉取,它也应该简单地返回而不做任何事情。随意添加--squash到上面的拉动中,这样您就不会拉入任何远程历史记录。

于 2011-06-23T19:57:42.427 回答
1

我在将项目从使用子模块迁移到子树时遇到了这个问题,最终都没有使用(至少不是直接使用)——我现在正在使用git-subrepo工具。

它通过在每个子树的根目录添加一个 .gitrepo 文件来解决这个问题。.gitrepo 文件包含跟踪信息,包括远程 URL,然后包含在后续克隆中。这确实简化了事情,唯一的复杂之处是 git-subrepo 必须单独安装在每台开发机器上(尽管没有它,存储库仍然可用)。

于 2017-03-31T01:32:47.110 回答