是否有可能为混帐合并忽略行尾的差异?

是否有可能为git merge忽略行尾的差异?

也许我问错了问题......但是:

我试图uisng config.crlf input ,但事情变得有点混乱和失控,特别是当我在事后把它应用。

一方面,在事后将这种配置似乎并没有影响到被提交到库,申请此选项前的文件。 另一件事是,突然间所有的提交,现在造成许多恼人的警告信息约CRLF转换为LF。

说实话,我真的不关心什么行结束时,我个人比较喜欢的Unix风格\n但不管。 我所关心的,是git merge是一个有点聪明和忽略行结束的差异。

有时候,我有两个完全相同的文件,但混帐会仅仅是因为它们使用了不同的行结束符它们标记为冲突是(和冲突整个文件)。

更新:

我发现git diff接受--ignore-space-at-eol选项,才有可能让git merge使用这个选项呢?

--------------解决方案-------------

更新2013:

最近的Git版本的使用授权与战略合并recursive和战略选项 -X

  • 从“Git的合并与固定混合空格和制表符有两个分支”:

混帐合并-s递归-Xignore空间-AT-EOL

但是,使用-Xignore-space-change ”也是一种可能性

  • FAB-V以下提到:

    混帐合并主-s递归-X重新规格化



jakub.g还评论说, 战略还与挑肥拣瘦

git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize

这工作比要好得多ignore-all-space



原来的答复(2009年5月)

该补丁忽略EOL风格已经提出了2007年6月,但只关注git diff --ignore-space-at-eolgit merge

当时,这个问题已经被askeed:

--ignore-space-at-eol是一种选择git-merge
合并是哪里此功能的问题。
什么是自动分辨合并与影响这些选项的语义 - 他们只用于重命名检测或做我们,比如,没有标志,只有空白改变的冲突? 如果我们不这样做,哪个版本我们会自动接受?

胡滨野Ç是不完全热烈:

这当然是诱人的,但我怀疑,应留待以后发子弹。
我怀疑这将引入两种不同的diff的一个概念,一个被机械加工(即使用与“混帐 - 合并 - 递归”的合并,并申请以“混帐上午”),而另一个被检查人类理解。
它通常可能是有用的munge输入为后者的情况下,即使从比较被改写的输入文件的输出可能不容易可用于机械应用。

总的想法,当涉及到git merge ,是依靠第三方合并工具。

举例来说,我已经安装DiffMerge来对Git的合并工具,设置一个规则集允许合并工具忽略EOL对某些类型的文件。



安装在Windows上,与MSysGit1.6.3,无论是DOS或Git的bash命令,用DiffMerge或KDiff3:

  • 设置一个目录到您的路径(这里是c:\HOMEWARE\cmd
  • 在该目录中添加脚本merge.sh(包装为您最喜爱的合并工具)

merge.sh:

#!/bin/sh

# Passing the following parameters to mergetool:
# local base remote merge_result

alocal=$1
base=$2
remote=$3
result=$4

if [ -f $base ]
then
#"C:/Program Files/SourceGear/DiffMerge/DiffMerge.exe" "$alocal" "$base" "$remote" -m --result="$result" --title1="Mine" --title2="Merging to: $result" --title3="Theirs"

# for merge respecting eol, KDiff3 is better than DiffMerge (which will always convert LF into CRLF)
# KDiff3 will display eol choices (if Windows: CRLF, if Unix LF)
"C:/Program Files/KDiff3/kdiff3.exe" -m "$base" "$alocal" "$remote" -o "$result"
else
#there is not always a common ancestor: DiffMerge needing 3 files, BASE will be the result
#"C:/Program Files/SourceGear/DiffMerge/DiffMerge.exe" "$alocal" "$result" "$remote" -m --result="$result" --title1="Mine" --title2="Merging to: $result" --title3="Theirs"

# KDiff3 however does know how to merge based on 2 files (not just 3)
"C:/Program Files/KDiff3/kdiff3.exe" -m "$base" "$remote" -o "$result"
fi

  • 声明你的合并包装的Git

Git的配置命令:

git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd "merge.sh \"$PWD/$LOCAL\" \"$PWD/$BASE\" \"$PWD/$REMOTE\" \"$PWD/$MERGED\"
git config --global mergetool.diffmerge.trustExitCode false
git config --global mergetool.diffmerge.keepBackup false

  • 检查autoCRLF是假的

混帐配置,在系统层面:

git config ---system core.autoCRLF=false

  • 测试,当两条线是相同的(但他们的EOL字符),无论DiffMerge或KDiff3将忽略合并过程中的线。

DOS脚本(注意:该命令unix2dos来自这里,而被用来模拟一个Unix EOL式这个命令已经被复制在这个答案的开头提到的目录):

C:\HOMEWARE\git\test>mkdir test_merge C:\HOMEWARE\git\test>cd test_merge C:\HOMEWARE\git\test\test_merge>git init C:\HOMEWARE\git\test\test_merge>echo a1 > a.txt & echo a2 >> a.txt C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "a.txt, windows eol style" C:\HOMEWARE\git\test\test_merge>git checkout -b windows Switched to a new branch 'windows' C:\HOMEWARE\git\test\test_merge>echo a3 >> a.txt & echo a4 >> a.txt C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "add two lines, windows eol style" C:\HOMEWARE\git\test\test_merge>git checkout master C:\HOMEWARE\git\test\test_merge>git checkout -b unix Switched to a new branch 'unix' C:\HOMEWARE\git\test\test_merge>echo au3 >> a.txt & echo au4 >> a.txt && echo au5 >> a.txt C:\HOMEWARE\git\test\test_merge>dos2unix a.txt Dos2Unix: Processing file a.txt ... C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "add 3 lines, all file unix eol style" [unix c433a63] add 3 lines, all file unix eol style C:\HOMEWARE\git\test\test_merge>git merge windows Auto-merging a.txt CONFLICT (content): Merge conflict in a.txt Automatic merge failed; fix conflicts and then commit the result. C:\HOMEWARE\git\test\test_merge>git ls-files -u 100644 39b4c894078a02afb9b1dfeda6f1127c138e38df 1 a.txt 100644 28b3d018872c08b0696764118b76dd3d0b448fca 2 a.txt 100644 3994da66530b4df80189bb198dcfac9b8f2a7b33 3 a.txt C:\HOMEWARE\git\test\test_merge>git mergetool Merging the files: a.txt Normal merge conflict for 'a.txt': {local}: modified {remote}: modified Hit return to start merge resolution tool (diffmerge):

在这一点上(打击“回”),DiffMerge或KDiff3将打开,你会为你自己看看行实际上是合并,什么行会被忽略。

警告:结果文件总是会在Windows EOL模式(CRLF)与DiffMerge ...
KDiff3提供了保存或那种方式。

我一直在寻找同样的答案,我发现这

合并分支具有不同的签入/签属性

如果您已经添加属性,导致规范库格式的文件,以更改,如添加清洁/污迹过滤器或文本/ EOL / IDENT属性,合并任何其中的的属性是不到位的文件通常会导致合并冲突。

为了避免这些不必要的合并冲突,git的,可以说通过设置merge.renormalize配置变量解析三方合并时运行一个虚拟退房和入住在一个文件中的所有三个阶段。 这可以防止造成虚假合并冲突时,转换后的文件合并一个未转换的文件引起办理入住手续的转换变化。

只要甚至在已经弄脏文件“→涂抹干净”作为一个“干净”相同的输出结果,这一战略将自动解决所有的过滤器有关的冲突。 过滤器不以这种方式行事可能会导致必须以手动方式解决更多的合并冲突。

因此,在运行任何存储库这个命令不会做的伎俩:

git config merge.renormalize true

看完后http://stackoverflow.com/a/12194759/1441706和http://stackoverflow.com/a/14195253/1441706

对我来说,这个命令做的伎俩完美:

git merge master -s recursive -X renormalize

作为这样的回答:http://stackoverflow.com/a/5262473/943928

您可以尝试git merge -s recursive -Xignore-space-at-eol

我所做的就是把一切都为默认值(即autocrlf = TRUE),触摸的所有文件(找到-exec触摸{} \;),让混帐看到他们为“修改”,并承诺他们回来,并用它做。 否则,你将永远要么被烦人的消息或出人意料的变化所困扰,或者必须把所有Git的空格功能关闭。

你将失去追溯信息,但它更好地做到这一点宜早不宜迟:)

“混帐合并-Xrenormalize”就像一个魅力。

它看起来并不像这样可以直接做,但这个职位意味着围绕着工作。

http://osdir.com/ml/git/2009-02/msg02532.html

http://stahlforce.com/dev/index.php?tool=remcrlf

我试了一下,但如果在你的代码的最后一行后,您尚未拥有CRLF它增加了本身就是一个LF和文件看起来git的改变。 除此之外,它的工作原理。

在我看来,现在最好的办法就是将它们合并之前,标准化的两个分支的行结束(和提交)。

我用Google搜索“转换CRLF到LF”,发现这是第一个结果:
http://stahlforce.com/dev/index.php?tool=remcrlf

我下载和使用,似乎是一个很好的工具。

>sfk remcr . .py

请务必虽然指定一个目录和文件类型(如的.py),否则可能会试图惹的内容.git目录!

AFAICT,(我还没有尝试过),你可以使用git diff比较要合并到共同祖先的分支,然后应用结果与git apply 。 这两个命令都--ignore-whitespace选项忽略行结束和空格的错误。

不幸的是,如果补丁没有干净的应用,整个操作过程被中止。 你不能修复合并冲突。 有一个--reject选择离开unpatchable大块在.rej文件,这帮助,但是不一样的具有在一个文件中示出的合并冲突。

阅读解决合并冲突后:强制覆盖所有文件

我终于解决了我的版本这个问题。 我试图从上游回购拉更新,但我目前的一人有CRLF相关的问题,无法作为结果合并。 应该指出我没有本地更改,我需要担心的。 下面的步骤解决我的问题:

按上同步叉GitHub的指令(https://help.github.com/articles/syncing-a-fork/):

  1. git fetch upstream
  2. git reset --hard upstream/master
    我有限的混帐的理解告诉我这是做什么我want--衍合我的叉子(没有实际未提交的修改),以获得所有上游源所做的更改。 据有关人士介绍页面,通常应该不需要这一步,但CRLF问题使它需要。
  3. git merge upstream/master
  4. git push
分类:混帐 时间:2015-03-15 人气:6
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.838 (s). 10 q(s)