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.
我认为这本身不能通过合并来完成,但这些步骤可能会起作用,至少就最终产品而言是这样。第一的:
% 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 中的文件副本以获取提交并覆盖工作树中的内容。然后,您可以像平常一样将这些更改提交到本地存储库。生成的提交不会对它的来源有任何引用,但它至少应该让您的存储库包含您想要的文件版本。