2

我有一个非常具体的工作流程,原因是我习惯git subtree将一个项目包含在另一个项目中:

  • 本地 git 存储库styling,由pull远程存储库 ( styling-exchange) 更新;

  • 另一个本地存储库styling-bare,用于同步stylingcode

  • 另一个本地 git 存储库code,它通过名为( )的远程分支将code/styling子目录添加为子树styling../styling-bare

  • production可以更新code的远程存储库git push production master

它应该如下所示:

code
|--/.git
|--.gitignore
|--/styling
|  |--file1
|  |--file2.v1
|--file3
styling-bare
styling
|--/.git
|--.gitignore
|--file1
|--file2.v2

工作流有两个用例:

  1. cdinto styling, pull from styling-exchange, 然后cdinto code, 更新子树, 对andstyling做一些改变file1and , push tofile2file3production
  2. cdinto ,对andcode进行一些更改,将更改推送到(子树推送),into , pull from ,将更改推送到file1file2file3styling-barecdstylingstyling-barestyling-exchange

我想file2在本地存储库styling/styling-barecode/production存储库中有两个完全不同且独立的版本。我需要从styling子树中获取所有更新code/styling,但我需要在file2内部进行跟踪code,而不需要从styling.

即,我想更新存储库styling中的子树code,但保留我自己的版本file2(同时在and和 file3 之间file1同步和在and之间同步),以便我可以将我自己的版本(v1)推送到以后。stylingcodecodeproductionfile2production

在 git 中是否有任何优雅的方法可以做到这一点,而无需符号链接或一些复杂的钩子?

请注意,我已经尝试过:

  • file2存储库中的.gitignore code:这不起作用,一旦我将子树拉到子树,文件就在那里styling

  • 不同分支的不同.gitignore版本,但是一旦我合并就会中断;

  • 我试图用 .git/info/exclude_from_styling排除 file2,这没有效果;

  • 我试图file2从索引中删除git update-index --assume-unchanged styling/file2,但这并不能解决我的问题;

  • 这个解决方案对我不起作用,因为我无法将所有styling目录推送到production

  • 我不确定过滤器驱动程序是否有助于解决问题;

  • 我需要file2在所有存储库中保持相同的名称,因此具有不同名称的解决方案也没有帮助。

4

2 回答 2

1

想到的建议:

  • git subtree pull您可以使用脚本来拉取存储库中的更改,而不是普通的code,这将执行以下操作:

    git subtree pull ... && git checkout branch/with/my/specific/file2 -- styling/file2.v1

  • 您可以从styling仅用于拉取的特殊分支中拉取更改,并将更改合并到您自己的分支中。我还没有测试过,但应该有办法系统地说“在合并时保留我的这个文件的版本”:告诉 git 在特定文件上使用我们的合并策略

我不会完全称其为优雅,每种方法都有其缺陷。

你提到你想避免钩子,但你也可以把它git checkout branch/with/my/specific/file2 -- styling/file2.v1放在一个 post-commit 钩子中,或者在结帐时放在一个“smudger”中(我刚刚发现了git filters

于 2013-06-28T08:12:54.817 回答
0
  1. 如果像缩小一样生成一个,您可以考虑使用一个自动构建它的脚本。根据经验:永远不要,但永远不要将生成的代码放入 VCS。
  2. 如果 v1 与 v2 是同一个文件,请使用

    git diff <sha>..<sha>
    

    或者您甚至可以使用 GUI(例如融合):

    git difftool <sha>..<sha>
    
  3. 如果您不更改它们,请不要在子树中两次添加相同的项目,而是在需要时使用脚本获取它(它的只读版本)。

了解您正在使用此项目布局的语言和框架会有所帮助。

于 2013-07-02T12:58:31.103 回答