Git-合并期间忽略文件


114

myrepo在远程beanstalk服务器上有一个仓库。

我将其克隆到本地计算机。还创建了两个分支:stagingdev。将这些分支也推到远程。

现在:

 local                   remote                   server
 --------------------------------------------------------  
 master  ==> Pushes to  `master`  ==> deployed to `prod`
 staging ==> Pushes to  `staging` ==> deployed to `staging`
 dev     ==> Pushes to  `dev`     ==> deployed to `dev`

我有一个名为的文件config.xml,在每个分支上都不同。

我只想在合并过程中忽略此文件。但是我希望在从/到repo分支签出或提交时将其包括在内。

我想要这样做的原因是,我们有一个部署脚本,可以拉出(签出)特定的分支并部署在相应的服务器上。因此config.xml,在部署时,我们需要将该特定分支的文件放入上述特定服务器中。

我想.gitignore不会工作。还有哪些其他选择?请注意,被忽略的文件应该是检出和提交的一部分,这一点很重要。仅在合并期间应忽略它。

谢谢!


在其默认模式下,git pull是git fetch的缩写,其后是git merge FETCH_HEAD。因此,您声明彼此之间存在某种冲突。
2013年

好吧,我会说,它的结帐。不拉。我将更新问题以使其更加清楚。
Kevin Rave


2
您是否找到了解决方案?git属性仅在文件在合并的分支之间存在冲突的情况下才有用,因此它并不总是足够的。
pvinis

您有没有研究过象征性的符号(而不是git之后的符号)或什至是救援的硬链接?
弗兰克·诺克

Answers:


94

我通过使用带有--no-commit选项的git merge命令解决了这个问题,然后显式删除了暂存的文件并忽略了对该文件的更改。例如:说我想忽略对myfile.txt我的任何更改,请按照以下步骤操作:

git merge --no-ff --no-commit <merge-branch>
git reset HEAD myfile.txt
git checkout -- myfile.txt
git commit -m "merged <merge-branch>"

如果您有要跳过的文件列表,则可以将语句2和3放入for循环中。


2
如果您希望在快进策略中进行合并时不覆盖文件,请添加“ --no-ff”。
Ilia Shakitko '17

1
那到底是git reset HEAD myfile.txt做什么的呢?这对我们的目标有何帮助?
Kid_Learning_C

您如何将第2行和第3行循环放置?
AndroidDev

52

我最终找到了git attributes。尝试一下。到目前为止工作。尚未检查所有方案。但这应该是解决方案。

合并策略-Git属性



1
这里是正确的链接,混帐的合并策略部分属性文件:git-scm.com/book/en/v2/...
阿德里安Laurenzi

3

9
如果没有冲突,这似乎是一个问题?文件仍会合并吗?
布雷特(Brett),

18

.gitattributes -是存储库的根级别文件,用于定义文件的子目录或子集的属性。

您可以指定属性来告诉Git对特定文件使用不同的合并策略。在这里,我们要保留config.xml分支的现有内容。我们需要将设置merge=oursconfig.xmlin .gitattributes

merge=ours 如果发生合并冲突,告诉git使用我们的(当前分支)文件。

  1. .gitattributes在存储库的根级别添加文件

  2. 您可以在.gitattributes文件中为confix.xml设置属性

    config.xml merge=ours
    
  3. 然后定义一个虚拟的我们的合并策略:

    $ git config --global merge.ours.driver true
    

如果合并stag表单dev分支,则stag分支的config.xml保留原始版本,而不是与config.xml文件发生合并冲突。


15
但是,如果没有冲突怎么办?如何在合并期间始终保留某个文件?
伊戈尔·雅洛沃伊

2
@IgorYalovoy:如果没有冲突……那么,这有点棘手,因为它实际上是从哈希ID起作用的,但是:如果从合并基础到任一分支提示版本config.xml完全不变,则Git会采用更改后的版本,而不会看着merge.ours.driver设置。所以你是正确的关注。
torek '18

1
从Git文档复制粘贴:合并策略-Git属性。链接
kyb

每次FYI,此方法都会导致“合并提交”。
rsmets

2
“我们的”似乎是正在引入的新策略的任意名称。我发现这很混乱,因为theirs它是内置的合并策略。但是似乎可以编写<pattern> merge=foo,然后git config --global merge.foo.driver true,并且它会以相同的方式工作。
凯尔·斯特兰德

8

您可以从开始使用git merge --no-commit,然后根据需要编辑合并,例如,通过取消暂存config.xml或任何其他文件,然后提交。我怀疑您想在使用钩子之后进一步使其自动化,但是我认为值得至少手动进行一次。


2
有没有git attributes提供任何直接的解决方案?我不明白这一点。 git-scm.com/book/en/...
凯文狂欢

4

您可以将.gitignore其保留在config.xml存储库之外,然后使用后提交挂钩将适当的config.xml文件上载到服务器。


1
我知道那是种骇客。我正在尝试找到一个干净的解决方案。git呢attributes?知道它是如何工作的吗?我不明白这一点。 git-scm.com/book/en/...
凯文狂欢

1
我还没有听说过这些,我正在尝试应用merge = ours属性,看起来很有希望。
tlehman 2013年

1
Git属性很棒!您甚至可以告诉git如何区分非文本文件,因此您可以使用pdf2text来区分PDF!
tlehman 2013年

2

例:

  1. 你有两个分支:masterdevelop
  2. 您在develop分支中创建了文件,并希望在合并时忽略它

码:

git config --global merge.ours.driver true
git checkout master
echo "path/file_to_ignore merge=ours" >> .gitattributes
git merge develop

您也可以忽略具有相同扩展名的文件

例如所有带有.txt扩展名的文件:

echo "*.txt merge=ours" >> .gitattributes

1

git-update-index-在工作树中将文件内容注册到索引。

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

例:-

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


推入时很好,但拉入时仍会抱怨可能会覆盖文件。
罗尔夫(Rolf)

1
您是否尝试将文件条目添加到.gitignore文件中。@Rolf
Sireesh Yarlagadda
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.