Git - 在合并期间忽略文件

时间:2013-03-05 19:04:14

标签: git merge push ignore repository

我在远程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不会工作。还有什么其他选择?请注意,被忽略的文件应该是checkout和commit的一部分,这很重要。它只应在合并期间被忽略。

谢谢!

8 个答案:

答案 0 :(得分:69)

我通过使用带有--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&amp;如果你有一个要跳过的文件列表,那么for循环中有3个。

答案 1 :(得分:40)

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

Merge Strategies - Git attributes

答案 2 :(得分:10)

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

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

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

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

  2. 您可以在.gitattributes文件

    中为confix.xml设置属性
    config.xml merge=ours
    
  3. 然后使用以下命令定义我们的合并策略:

    $ git config --global merge.ours.driver true
    
  4. 如果您合并stag表单dev分支,而不是将合并与config.xml文件冲突,则stag branch的config.xml保留在您最初的任何版本中。

答案 3 :(得分:5)

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

答案 4 :(得分:3)

您可以使用.gitignoreconfig.xml保留在存储库之外,然后使用post commit hook将相应的config.xml文件上传到服务器。

答案 5 :(得分:3)

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

2 个不会导致合并冲突的简单示例:

  • 您希望在合并时在 master 中排除一个功能分支中的 config.xml 文件。 结果: config.xml 仍将合并到 master 中。
  • 您在两个分支中的 config.xml 文件都基于相同的提交。新代码已添加到功能中的文件中。 结果:编辑仍将合并到母版中。

答案 6 :(得分:1)

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

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

实施例: -

  

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

答案 7 :(得分:0)

示例:

  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