154

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`

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

我只想在合并期间忽略此文件。但是我希望在我从/向 repo 分支结帐或提交时将其包含在内。

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

估计.gitignore行不通 还有哪些其他选择?请注意,被忽略的文件应该是签出和提交的一部分,这很重要。它应该只在合并期间被忽略。

谢谢!

4

9 回答 9

138

我通过使用带有--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 循环中。

于 2013-05-09T06:34:50.743 回答
59

我最终找到了 git attributes。试一试。工作至今。尚未检查所有场景。但这应该是解决方案。

合并策略 - Git 属性

于 2013-03-05T20:29:38.933 回答
27

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

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

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

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

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

     <pattern> merge=foo
    

    让我们举个例子config.xml

     config.xml merge=foo
    
  3. 然后定义一个虚拟foo合并策略:

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

如果您合并stag表单dev分支,而不是与config.xml文件发生合并冲突,则 stag 分支的 config.xml 会保留您最初拥有的任何版本。

更多参考:merge_strategies

于 2018-03-19T08:27:06.730 回答
10

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

于 2013-03-05T19:07:24.447 回答
9

例子:

  1. 你有两个分支:master,develop
  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
于 2018-12-10T08:33:45.743 回答
5

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

于 2013-03-05T19:24:49.537 回答
5

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

不会导致合并冲突并因此提交被合并的 2 个简单案例:

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

要么按照unmesh-gurjarmerge --no-commit的演示使用,要么简单地将cherry-pick 个人提交提交给 master。后者当然相当麻烦,并带有其他几个陷阱(新的 SHA1 ID 等)

于 2021-03-03T18:50:55.800 回答
3

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

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

例子:-

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

于 2015-09-28T17:00:10.880 回答
0

考虑使用 git 钩子:

成功运行 git checkout 后,将运行 post-checkout 挂钩;您可以使用它为您的项目环境正确设置工作目录。这可能意味着移动不需要源代码控制的大型二进制文件、自动生成文档或类似的东西。

来源:https ://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks#:~:text=After%20you%20run,along%20those%20lines 。

您可以将这些文件放在单独的目录中,如有必要,可以选择通过.gitignore.

根据要切换到的分支的名称,来自post-checkout钩子的脚本可以获取该分支的正确文件(可能在子目录中)并将它们复制(覆盖)到正确的位置。这些特定于分支的单个文件需要位于.gitignore.

post-checkout中的脚本示例.git/hooks

#!/bin/sh

BRANCH=`git reflog | awk 'NR==1{ print $8; exit }'`

cp "./configs/$BRANCH/config.json" "./config.json"

exit 0

于 2022-01-20T10:50:47.970 回答