Git:忽略子树中的文件,但在本地跟踪它并将其推送到远程生产

时间:2013-06-23 12:45:59

标签: git git-submodules gitignore git-subtree

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

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

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

  • 另一个本地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

工作流程有两个用例:

  1. cd进入styling,从styling-exchange开始,然后从cd拉到code,更新styling子树,对{进行一些更改{1}}以及file1file2,请转到file3
  2. production进入cd,对codefile1以及file2进行一些更改,将更改推送到file3(子树推送), styling-bare cd styling,从styling-bare拉出,将更改推送到styling-exchange
  3. 我希望在本地存储库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子树,文件就在那里;

      < / LI>
    • different .gitignore versions用于不同的分支,但一旦合并就会中断;

    • 我尝试使用.git / info / exclude_from_styling exclude styling,这没有效果;

    • 我尝试使用file2从索引中删除file2,但这并不能解决我的问题;

    • this解决方案对我不起作用,因为我无法将所有git update-index --assume-unchanged styling/file2目录推送到styling;

    • 我不确定filter driver是否有助于解决问题;

    • 我需要在所有存储库中为production保留相同的名称,因此具有不同名称的solution也无济于事。

2 个答案:

答案 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)

  1. 如果生成就像缩小,您可以考虑使用自动构建它的脚本。根据经验:从不,但永远不要将生成的代码放在VCS中。
  2. 如果v1与v2是同一个文件,请使用

    git diff <sha>..<sha>
    

    或者你甚至可以使用GUI(例如meld):

    git difftool <sha>..<sha>
    
  3. 如果您不对它们进行更改,请不要在子树中添加两次相同的项目,而是在需要时使用脚本来获取它(只读它的版本)。
  4. 了解您正在使用此项目布局的语言和框架会有所帮助。