我有一个非常具体的工作流程,原因是我使用git subtree
将一个项目包含在另一个项目中:
本地git存储库styling
,由pull
从远程存储库(styling-exchange
)更新;
另一个本地存储库styling-bare
,用于同步styling
和code
另一个本地git存储库code
,其code/styling
子目录通过名为styling
(../styling-bare
)的远程分支添加为subtree < / p>
远程production
存储库,可以使用code
git push production master
更新
它应该是这样的:
code
|--/.git
|--.gitignore
|--/styling
| |--file1
| |--file2.v1
|--file3
styling-bare
styling
|--/.git
|--.gitignore
|--file1
|--file2.v2
工作流程有两个用例:
cd
进入styling
,从styling-exchange
开始,然后从cd
拉到code
,更新styling
子树,对{进行一些更改{1}}以及file1
和file2
,请转到file3
production
进入cd
,对code
和file1
以及file2
进行一些更改,将更改推送到file3
(子树推送), styling-bare
cd
styling
,从styling-bare
拉出,将更改推送到styling-exchange
我希望在本地存储库file2
VS styling/styling-bare
存储库中有两个完全不同且独立的code/production
版本。我需要将styling
子树中的所有更新都发送到code/styling
,但我需要在file2
内跟踪code
,而不需要styling
的任何更新。< / p>
即。我想更新styling
存储库中的code
子树,但在我执行此操作时保留我自己的file2
版本(同时file1
同步styling
}和code
以及{3}}和code
之间的文件3已同步,以便我可以将我自己的production
版本(v1)推送到file2
。< / p>
在没有符号链接或一些复杂的钩子的git中有没有优雅的方法呢?
注意,我已尝试过:
production
存储库中 .gitignore file2
:这不起作用,一旦我将子树拉到code
子树,文件就在那里;
我尝试使用.git / info / exclude_from_styling exclude styling
,这没有效果;
我尝试使用file2
从索引中删除file2
,但这并不能解决我的问题;
this解决方案对我不起作用,因为我无法将所有git update-index --assume-unchanged styling/file2
目录推送到styling
;
我不确定filter driver是否有助于解决问题;
我需要在所有存储库中为production
保留相同的名称,因此具有不同名称的solution也无济于事。
答案 0 :(得分:1)
想到的建议:
您可以使用脚本来提取git subtree pull
存储库中的更改而不是普通的code
,而这些更改可以执行以下操作:
git subtree pull ... && git checkout branch/with/my/specific/file2 -- styling/file2.v1
您可以在仅用于提取的特殊分支中从styling
提取更改,并将更改合并到您自己的分支中。我没有对它进行过测试,但应该有办法系统地说“保持我的这个文件版本合并”:tell git to use ours merge strategy on specific files
我并没有完全称之为优雅,每种方法都有其缺陷。
你提到你想避免钩子,但你也可以将git checkout branch/with/my/specific/file2 -- styling/file2.v1
置于提交后挂钩中,或者在结账时放入“smudger”(我刚发现git filters)< / p>
答案 1 :(得分:0)
如果v1与v2是同一个文件,请使用
git diff <sha>..<sha>
或者你甚至可以使用GUI(例如meld):
git difftool <sha>..<sha>
了解您正在使用此项目布局的语言和框架会有所帮助。