Git - 在合并期间忽略文件

Kev*_*ave 98 git merge push ignore repository

myrepo在远程beanstalk服务器上调用了一个repo .

我把它克隆到我的本地机器上.创建了两个额外的分支: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`
Run Code Online (Sandbox Code Playgroud)

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

我想仅在合并期间忽略此文件.但是我希望在结帐或从/向repo分支提交时包含它.

我想要的原因是,我们有一个部署脚本,可以拉出(签出)特定分支并在各自的服务器上部署.因此,我们需要config.xml特定分支的文件在部署时进入特定服务器,如上所示.

我想.gitignore不会工作.还有什么其他选择?请注意,被忽略的文件应该是checkout和commit的一部分,这很重要.它只应在合并期间被忽略.

谢谢!

小智 82

我通过使用带有--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>"
Run Code Online (Sandbox Code Playgroud)

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

  • @Kid_Learning_C:`git reset HEAD myfile.txt`取消暂存文件(该文件是在`--no-commit`合并后暂存的) (3认同)
  • 如果你想在快进策略中合并时不要覆盖文件,我会添加"--no-ff". (2认同)
  • 那么 `git reset HEAD myfile.txt` 到底是做什么的呢?它对我们的目标有何帮助? (2认同)

Kev*_*ave 48

我最终找到了git attributes.试试吧.到目前为止工作.尚未检查所有方案.但它应该是解决方案.

合并策略 - Git属性

  • 如果没有冲突,这似乎是一个问题?文件还会合并吗? (17认同)
  • 但我发现了这个[git-scm.com/book/ch7-2.html#Merge-Strategies ](http://git-scm.com/book/ch7-2.html#Merge-Strategies) (4认同)
  • 发现这篇文章在文章https://medium.com/@porteneuve/how-to-make-git-preserve-specific-files-while-merging-18c92343826b中有所解释 (3认同)

eig*_*sha 16

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

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

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

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

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

    config.xml merge=ours
    
    Run Code Online (Sandbox Code Playgroud)
  3. 然后用以下方法定义我们的虚拟合并策略:

    $ git config --global merge.ours.driver true
    
    Run Code Online (Sandbox Code Playgroud)

如果您合并stag表单dev分支,而不是使合并与config.xml文件冲突,则stag branch的config.xml保留在您最初的任何版本中.

  • 但是如果没有冲突怎么办?如何在合并期间始终保留某个文件? (7认同)
  • @IgorYalovoy:如果没有冲突......好吧,这有点棘手,因为它实际上是从哈希 ID 开始工作的,但是:如果`config.xml` 从合并基础到任一分支提示版本*完全没有变化*,则 Git只需要更改后的版本,而不查看 `merge.ours.driver` 设置。所以你的担心是对的。 (2认同)
  • “我们的”似乎是对正在推出的新战略的随意命名。我发现这很令人困惑,因为“他们的”是内置的合并策略。但似乎可以写 `&lt;pattern&gt; merge=foo`,然后写 `git config --global merge.foo.driver true`,它会以同样的方式工作。 (2认同)

gcb*_*son 7

你可以先使用git merge --no-commit,然后编辑你想要的合并,即通过unstaging config.xml或任何其他文件,然后提交.我怀疑你想在使用钩子后进一步自动化它,但我认为值得手动至少进行一次.

  • `git attributes` 是否提供任何直接的解决方案?我无法理解这一点。http://git-scm.com/book/en/Customizing-Git-Git-Attributes#Merge-Strategies (2认同)

Mat*_*att 7

正如许多人评论的那样,应该注意的是,接受的答案及其副本(对特定文件使用自定义合并策略)仅在存在实际合并冲突的情况下才有效

2 个简单的情况不会导致合并冲突,因此提交会被合并:

  • config.xml您在功能分支中有一个文件,而不是在主分支中。您想在合并期间排除它
  • config.xml在两个分支中的文件都基于相同的提交。新代码已添加到功能文件中。

要么像unmesh-gurjarmerge --no-commit演示的那样使用,要么简单地将单独的提交挑选到 master 中。当然,后者相当麻烦,并且还存在一些其他陷阱(新的 SHA1 ID 等)

  • 对此有何解决办法? (2认同)

Sol*_*sei 6

例子:

  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
Run Code Online (Sandbox Code Playgroud)

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

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

echo "*.txt merge=ours" >> .gitattributes
Run Code Online (Sandbox Code Playgroud)

  • 这仅在发生冲突的情况下有效! (3认同)

tle*_*man 5

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

  • 我知道那是一种黑客行为。我正在尝试找到一个干净的解决方案。git `attributes` 怎么样?知道它是如何工作的吗?我无法理解这一点。http://git-scm.com/book/en/Customizing-Git-Git-Attributes#Merge-Strategies (2认同)