Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git-如何从合并中排除文件_Git_Merge - Fatal编程技术网

git-如何从合并中排除文件

git-如何从合并中排除文件,git,merge,Git,Merge,我正试图在一个存储库中保存网站的两个项目。除了模板(html、css)文件和少数配置文件外,这些网站基本相同。 主站点(我说的超级站点)位于分支主站点中。第二个站点位于branch Secondary站点中。每次,当我在主分支中开发一些新功能时,我都想将其合并到secondarySite,但我想从合并中排除模板文件 我在这里找到了部分解决方案,但只有当我更改两个分支中的模板文件并且发生冲突时,它才起作用。当git没有冲突时,只需使用较新的远程版本的文件 我如何告诉git始终保持指定的本地文件不变

我正试图在一个存储库中保存网站的两个项目。除了模板(html、css)文件和少数配置文件外,这些网站基本相同。 主站点(我说的超级站点)位于分支主站点中。第二个站点位于branch Secondary站点中。每次,当我在主分支中开发一些新功能时,我都想将其合并到secondarySite,但我想从合并中排除模板文件

我在这里找到了部分解决方案,但只有当我更改两个分支中的模板文件并且发生冲突时,它才起作用。当git没有冲突时,只需使用较新的远程版本的文件

我如何告诉git始终保持指定的本地文件不变,即使没有冲突

或者我对这个问题使用了完全错误的方法


提前感谢您的帮助。

您是否尝试过使用.gitignore?git文档中提供的详细信息

如中所述,它们仅在发生冲突时有用。
那就是:看

一个非常有用的选项是告诉Git不要在特定文件有冲突时尝试合并它们,而是使用您的合并方而不是其他方的

这证实了这一点:

有没有办法从branchA合并到branchB,从branchB合并到branchB branchA同时完全忽略对跟踪文件的更改 并且存在于两个分支中

否。基本上,git中的提交对象由内容状态(即指向树对象的指针)和指向所有以前历史的指针(即零个或多个提交对象的“父”指针)组成。
提交对象的语义可以被认为是“我已经查看了所有父提交中的所有历史,并且我的树指针中包含的状态将取代它们”

因此,您可以将
B
合并到
A
,但保留
A
的文件副本(例如,使用“
ours
”策略)。但也就是说,您考虑了A和B的状态,并决定
A
的版本将取代
B
中发生的情况。如果以后要从
A
合并到
B
B
的文件版本甚至不会被视为合并的结果

通过不同的合并策略来解决这个问题并不是一个聪明的方法;这是git存储历史的数据结构的一个基本方面

如果这些模板位于子目录中,最好将它们隔离在自己的git repo中,以便将该repo作为子模块包含

如果没有,则需要在提交之前恢复错误合并的文件(如中所示):


这里git update index-将工作树中的文件内容注册到索引中

git update-index --assume-unchanged <PATH_OF_THE_FILE>
git更新索引--假定未更改
例如:-

git更新索引——假设somelocation/pom.xml未更改

在.gitignore中添加文件路径

或者我对这个问题使用了完全错误的方法

您对这个问题使用了完全错误的方法:)

问题在于,分支及其周围的工具旨在维护同一底层事物的不同版本

但你的两个网站其实并不是同一个东西,它们是两个不同的东西,有一些共同点,你不得不滥用git,因为你在他们的关系上对它撒谎

你的理智选择是:

  • 让你的回购协议代表所有(好的,两个)网站。因此,它们都在相同的目录结构中可见,并且使用不同的路径名。它们可能有单独的dev和release分支,但这是可选的。如果这两个站点有一些共同点,那么可以采用共享文件的形式

    例如

  • 对每个站点进行单独的回购,并复制公共文件。您只需复制更改即可

  • 对每个站点进行单独的回购,对普通内容进行第三次回购,并使用子模块将supersite+common在一个位置合并,secondsite+common在另一个位置合并

    例如

    注意,子模块引用相同的repo,但每个实例当前可以位于不同的分支或提交上


  • 在某种程度上,正确的选择取决于两个站点独立变化的程度,共享比特的变化频率,强制两个站点使用相同版本的共享比特是否合适,以及在每个分支中共享与唯一的内容占总内容的比例等。

    ,在根目录中添加文件
    .gittributes

    对于每个分支,指定合并时要忽略的文件,如下所示:

    filename merge=ours
    
    不要忘记为此激活驱动程序:

    git config --global merge.ours.driver true
    

    尝试合并,您将看到在合并过程中,每个分支中
    .gittributes
    中指定的文件将保持不变。

    谢谢您的建议。问题是,我需要跟踪两个分支中的文件-我只想保持这些文件“特定于分支”。您是否找到了解决方案?这是这个特定问题的正确答案,值得更多的投票<代码>“我试图将网站的两个项目保存在一个存储库中。”
    分支不是用于保存不同但类似的项目,而是用于保存同一项目的不同版本。
    super-repo/site    # super site content
    super-repo/common  # common repo as submodule
    second-repo/site   # second site content
    second-repo/common # same common repo as submodule
    
    filename merge=ours
    
    git config --global merge.ours.driver true