2011-06-09 86 views
10

我试图在一个存储库中保留2个网站项目。这个网站除了模板(html,css)文件和几个配置文件外基本相同。 主要网站(这是我说的Supersite)在分支大师。第二个站点在分支secondarySite中。每次,当我在主分支中开发一些新功能时,我想将它合并到secondarySite,但我想从合并中排除模板文件。git - 如何从合并中排除文件

我在这里找到了部分解决方案How do I tell git to always select my local version for conflicted merges on a specific file?但它只在我更改两个分支中的模板文件和发生冲突时才起作用。当没有冲突git只是使用较新的远程版本的文件。

如何告诉git 总是即使没有冲突,也可以保持指定的本地文件不变。

或者,也许我使用完全错误的方法来解决这个问题?

在此先感谢您的帮助。

+0

你有没有找到解决办法呢? – pvinis 2016-08-23 06:05:38

回答

3

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

+3

感谢您的建议。问题是我需要跟踪这两个分支中的文件 - 我只想保留这个文件“特定分支”。 – Marcin 2011-06-09 15:25:11

6

my answer on merge drivers中所述,它们仅在冲突情况下才有用。
applies to a merge=ours in a .gitattributes file:见Merge strategies

一个非常有用的选项是通知Git不尝试,当他们有冲突合并特定文件,而是在别人的使用合并的一面。

recent thread (2012)证实了这一点:

有没有办法合并来自branchA到branchB和branchB到 branchA而完全无视切换到正在跟踪 和存在于两个文件分支机构?

号从根本上说,在GIT中提交对象由一个内容状态(即,一个指针指向一个树对象)和指向所有以前的历史的(即,零个或多个“父”提交对象的指针)。
一个提交对象的语义可以被认为是“我已经查看了所有父提交中的所有历史记录,并且包含在我的树指针中的状态取代了它们全部”。

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

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

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

如果没有,那么你需要恢复文件提交(如this thread)之前错误地合并:

git merge --no-commit other 
git checkout HEAD XYZ # or 'git rm XYZ' if XYZ does not exist on master 
git commit 
2

这里的git更新索引 - 在工作树索引寄存器文件内容。

git update-index --assume-unchanged <PATH_OF_THE_FILE> 

例子: -

git update-index --assume-unchanged somelocation/pom.xml

添加文件路径中的.gitignore

1

或者,也许我用完全错误的做法,在PR oblem?

您使用完全错误的方式解决这个问题:)

的问题在于分支,和他们周围的工具,是用来维护不同版本的同一标的事情

但你的两个网站是不是真的相同的底层的东西,他们是两个不同的东西有一些共性,而你有,因为你躺在它关于他们的关系滥用饭桶。

你的理智选择是:

  1. 让你的回购代表宇宙中所有的(好吧,两者)网站。因此,它们在相同的目录结构中都可见并使用不同的路径名。他们可能有单独的开发和发布分支,但它是可选的。如果这两个网站有一些共同点,这可以只是共享文件的形式。

    例如。

    repo/supersite 
    repo/secondsite 
    repo/common 
    
  2. 为每个网站制作单独的回购,并复制通用文件。您可以复制更改

  3. 为每个站点分别建立一个回购站点,为常见项目制作第三个回购站,并使用子模块在一个地方组合supersite + common,在另一个地方使用secondsite + common。

    例如。

    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 
    

    注子模块指的是同一回购,但每个实例都可以是目前在不同的分支或提交

在一定程度上是正确的选择取决于有多少两个站点独立地变化,共享位的更改频率以及强制这两个站点使用相同版本的共享位以及共享内容的哪一部分与独特等共用等等。

1

在每个您的分支机构,在roo中添加文件.gitattributes吨。

对于每个分支,指定的文件以合并这样被忽略:

filename merge=ours 

不要忘记,以激活该驱动程序:

git config --global merge.ours.driver true 

尝试合并,你会请参阅每个分支中.gitattributes中指定的文件在合并发生时不会受到影响。