git:我可以子树只合并存储库的子路径吗?

kch*_*kch 14 git version-control merge subtree

我有遥控器Foo和Bar.Foo是一个包含大量目录的Web应用程序,/public其中相关的目录包含各种文件和其他目录.

Bar是一组库和前端使用的东西,因此它应该/public/bar在Foo中.Foo那里没有文件.

无论是子模块还是子树合并,这都是小菜一碟.然而…

Bar的树很乱,它有各种各样的预生产文件,比如PSD和FLA,唯一真正有用的部分就是它里面的东西/www/tools.

所以,我想要做的是将Bar's合并/www/tools到Foo中/public/bar,并假装Bar的其余部分甚至不存在.

可以做?

(我认为这与你最初将你的项目合并为子树的项目非常类似.我不知道该怎么做.)

mat*_*pie 11

我已成功使用以下命令完成此操作(为您的方案重写).

$ git remote add Bar /path/to/bar
$ git merge -s ours --no-commit Bar/master
$ git read-tree --prefix=public/bar -u Bar/master:www/tools/
Run Code Online (Sandbox Code Playgroud)

巨大的警告!我还在搞清楚如何从Bar获取/合并.这只会带来一次.

我目前合并更改的方式是这样的:

$ get fetch Bar
$ git pull -X subtree=public/bar Bar master
Run Code Online (Sandbox Code Playgroud)

这将留下冲突,说已删除了大量文件,你可以只是git rm然后git commit.

我当然愿意接受关于更好地改变方式的建议.

由于这是一个旧线程,我应该补充一点,我正在运行Git 1.7.9.


Bri*_*ter 0

我认为这本身不能通过合并来完成,但这些步骤可能会起作用,至少就最终产品而言是这样。第一的:

% git fetch Bar
Run Code Online (Sandbox Code Playgroud)

这会从 Bar 存储库中获取最新的提交,但不会尝试合并它们。它在 .git/FETCH_HEAD 中记录提交的 SHA

% cat .git/FETCH_HEAD
b91040363160aab4b5dd46e61e42092db74b65b7                branch 'Bar' of ssh://blah...
Run Code Online (Sandbox Code Playgroud)

这显示了远程分支最新提交的 SHA 标识符是什么。

% git checkout b91040363160aab4b5dd46e61e42092db74b65b7 www/tools
Run Code Online (Sandbox Code Playgroud)

这将获取 www/tools 中的文件副本以获取提交并覆盖工作树中的内容。然后,您可以像平常一样将这些更改提交到本地存储库。生成的提交不会对它的来源有任何引用,但它至少应该让您的存储库包含您想要的文件版本。