是否可以忽略合并中的文件更改?

时间:2018-04-23 12:20:07

标签: git commit

我有两个分支,硕士和展览。展览只是当地的一个分支。

当我在两个分支上运行diff时,它向我显示sitemap.xml在分支之间存在一些差异,即本地配置的路径。但是,当我从展览合并到Master时,Sitemap.xml中的更改不会合并,这很好(因为它们包含本地路径)。

在两个分支上执行git status都没有添加/提交任何内容,除非我进行了其他更改,我添加了这些更改,然后提交并在合并中进行了修改。

sitemap.xml文件不在gitignore中。

在某些时候我必须设置一些内容,因此站点地图更改不会提交给实时主版本,但我不知道是什么,或者如何找出什么。 Git中有什么东西允许这个吗?

我需要重新创建此行为,因为其他人在新分支中进行了一些更改,并使用他的更改覆盖了我的sitemap.xml。我错过了一些明显的东西吗如果我没有添加或提交它,我会想到它会显示在git状态。

2 个答案:

答案 0 :(得分:1)

您可能将sitemap.xml标记为假设未更改。来自git help update-index

  

要设置“假定未更改”位,请使用--assume-unchanged选项。要取消设置,请使用--no-assume-unchanged。要查看哪些文件设置了“假设未更改”,请使用git ls-files -v(请参阅git-ls-files(1))。

以下示例展示了行为

$ git init
Initialized empty Git repository in /tmp/foo/.git/
$ echo 1 > sitemap.xml; git add sitemap.xml; git commit -m "sitemap"
[master (root-commit) f1a1f79] sitemap
 1 file changed, 1 insertion(+)
 create mode 100644 sitemap.xml
$ git checkout -b exhibition
Switched to a new branch 'exhibition'

$ echo 2 > sitemap.xml
$ git update-index --assume-unchanged sitemap.xml
$ git status
On branch exhibition
nothing to commit, working tree clean

$ echo a > A; git add A; git commit -m a
[exhibition af58c3b] a
 1 file changed, 1 insertion(+)
 create mode 100644 A
$ git status
On branch exhibition
nothing to commit, working tree clean

<强>参考

  

- [无糖]假设-不变

     

指定此标志时,不会更新为路径记录的对象名称。相反,此选项设置/取消设置路径的“假定未更改”位。当“假设未更改”位打开时,用户承诺不更改文件并允许Git假定工作树文件与索引中记录的文件匹配。如果要更改工作树文件,则需要取消设置该位以告知Git。当在具有非常慢的lstat(2)系统调用(例如cifs)的文件系统上处理大项目时,这有时很有用。

     

如果需要在索引中修改此文件,Git将失败(优雅地),例如合并时提交;因此,如果上游更改了假定未跟踪文件,则需要手动处理该情况。

答案 1 :(得分:1)

你不太可能有一些设置告诉git忽略合并中的站点地图;特别是如果它正在合并您的同事分支的站点地图更改。您的分支机构之间的“合并基础”更有可能与sitemap.xml分支具有相同版本的exhibition。在这种情况下,在合并期间exhibition分支不会被视为更改文件,而master分支将被视为更改您正在谈论的本地路径;因此,git会应用master分支更改,您最终会看到master上的文件。

您可以使用

之类的命令对此进行测试
git diff --name-only exhibition $(git merge-base exhibition master)

如果此打印的列表不包含站点地图,则上述内容将说明您所看到的内容。

如果情况并非如此,则不清楚你做了什么导致这种行为(这有点问题,因为取决于你做了什么,也可能有其他影响)。特别提到.gitignore;这与合并的处理方式无关。 .gitignore唯一能做的就是使默认情况下指定路径上的未跟踪文件保持未跟踪状态。

此类问题通常会引出至少一个建议使用skip-worktreeassume-unchanged等索引标记的响应。这些“解决方案”有时可能有用,但我不推荐它们。 (首先,由于索引不是共享的,它们只会在你的本地仓库中有效;所以有一种可能性就是你设置了这样的东西,现在正在遇到它的一个限制。)至少,这不是他们旨在支持的行为。

在git中没有一个很好的方法可以做到这一点。您可以通过设置自定义合并驱动程序来实现,但这仅在文件本身需要合并时才有效;因此,如果master上的文件未更改,则无效。

需要包含本地路径或配置的文件的最佳解决方案是在源代码管理下存储文件的模板,并在构建过程中自行生成文件。在这种情况下,生成的文件不应该放在源代码管理中,因此它可以包含在.gitignore中,也可以在工作树之外的路径生成(我更喜欢后者,个人)。然后,您可以在源代码管理中包含一个或多个文件,并在不同情况下将值合并到模板中,并使用构建工具选择其中一个或具有本地值的非源控制文件。