Git状态忽略行尾/相同文件/窗口&Linux环境/Dropbox/Meld

我怎么做?

Git状态

忽略行尾差异?

背景信息:

我随机使用Windows和Linux来完成这个项目。该项目在Dropbox中。

我发现了很多关于如何让git diff忽略行尾的信息。因为我使用的是MELD,所以git diff会为每个文件打开MELD.梅尔德说“相同的文件”。

那么我该如何避免这种情况。Git应该只为更改的文件打开MELD. 如果只是文件结尾不同,则Git状态不应将文件报告为已更改。

编辑:原因:

发生这种情况是因为Windows上的此设置

core.autocrlf true

因此,我检查了Linux上的工作副本,并在Windows上将core.autocrlf设置为false.

如果知道如何让Git状态忽略不同的新行,那就太好了。

181449 次浏览

尝试像这样设置core.autocrlf值:

git config --global core.autocrlf true

改为使用.gitAttributes,设置如下:

# Ignore all differences in line endings
*        -crlf

.gitAttributes与全局.gitConfig位于同一目录中。如果.gitAttributes不存在,请将其添加到该目录。添加/更改.gitAttributes后,您必须对存储库进行硬重置,以便成功地将更改应用于现有文件。

我同时使用Windows和Linux,但ABC0__解决方案对我没有帮助。我甚至在git checkout <filename>之后什么都没有改变。

因此,我使用变通方法将git status替换为gitstatus.sh

#!/bin/bash


git status | grep modified | cut -d' ' -f 4 | while read x; do
x1="$(git show HEAD:$x | md5sum | cut -d' ' -f 1 )"
x2="$(cat $x | md5sum | cut -d' ' -f 1 )"


if [ "$x1" != "$x2" ]; then
echo "$x NOT IDENTICAL"
fi
done

我只是比较了一个文件和它在存储库中的兄弟文件的md5sum

示例输出:

$ ./gitstatus.sh
application/script.php NOT IDENTICAL
application/storage/logs/laravel.log NOT IDENTICAL

我创建了一个脚本来忽略行尾的差异:

它将显示未添加到提交列表和已修改的文件(在忽略行尾差异后)。您可以添加参数“ add ”以将这些文件添加到您的提交中。

#!/usr/bin/perl


# Usage: ./gitdiff.pl [add]
#    add : add modified files to git


use warnings;
use strict;


my ($auto_add) = @ARGV;
if(!defined $auto_add) {
$auto_add = "";
}


my @mods = `git status --porcelain 2>/dev/null | grep '^ M ' | cut -c4-`;
chomp(@mods);
for my $mod (@mods) {
my $diff = `git diff -b $mod 2>/dev/null`;
if($diff) {
print $mod."\n";
if($auto_add eq "add") {
`git add $mod 2>/dev/null`;
}
}
}

源代码: https://github.com/lepe/scripts/blob/master/gitdiff.pl

更新

  • 由evandro777修复:当文件名或目录中有空间时

与Windows操作系统上的Git命令相关的问题

$ git add --all

警告:LF将在..中替换为CRLF.

该文件将在您的工作目录中以其原始行结尾。

分辨率

$ git config --global core.autocrlf false
$ git add --all

没有出现任何警告信息。

这个答案似乎是相关的,因为OP提到了多操作系统解决方案的需求。这个GitHub帮助文章详细介绍了跨操作系统处理行尾的可用方法。有全局和每次回购的方法来管理跨操作系统的行尾。

全球办法

在Linux或OS X上配置Git行尾处理:

git config --global core.autocrlf input

在Windows上配置Git行尾处理:

git config --global core.autocrlf true

每次回购方法:

在repo的根目录中,创建一个.gitattributes文件,并为项目文件定义行尾设置,一次一行,格式如下:path_regex line-ending-settings其中line-ending-settings是以下之一:

  • 文字
  • 二进制(Git不应修改行尾的文件-因为这可能导致某些图像类型(如PNG)无法在浏览器中呈现)

可以进一步配置text值,以指示Git如何处理匹配文件的行尾:

  • text-将行尾更改为操作系统本机行尾。
  • text eol=crlf-在结帐时将行尾转换为CRLF
  • text eol=lf-在结帐时将行尾转换为LF
  • text=auto——明智的默认设置,让Git自行决定行句柄。

以下是示例.gitAttributes文件的内容:

# Set the default behavior for all files.
* text=auto


# Normalized and converts to
# native line endings on checkout.
*.c text
*.h text


# Convert to CRLF line endings on checkout.
*.sln text eol=crlf


# Convert to LF line endings on checkout.
*.sh text eol=lf


# Binary files.
*.png binary
*.jpg binary

有关如何在更改ABC0__的行尾设置后刷新您的回购的更多信息。TLDR:

使用Git

备份文件,删除存储库中的所有文件(.git目录除外),然后一次性恢复所有文件。 将当前文件保存在Git中,这样您的工作就不会丢失。

git add . -u

git commit -m "Saving files before refreshing line endings"

删除索引并强制Git重新扫描工作目录。

rm .git/index

重写Git索引以获取所有新的行尾。

git reset

显示重写的规范化文件。

在某些情况下,这是所有需要做的。其他人可能需要完成以下附加步骤:

git status

将所有更改的文件添加回去,并准备提交。这是您检查哪些文件(如果有)未更改的机会。

git add -u

在这里看到许多消息是绝对安全的,这些消息是:“警告:CRLF将被文件中的LF替换。”

重写.gitattributes文件。

git add .gitattributes

将更改提交到存储库。

git commit -m "Normalize all the line endings"

我已经改变了+舒克辛.伊万脚本一点-忽略Windows/Linux行结束。

#!/bin/bash


git status | grep modified | cut -d' ' -f 4- | while read x; do
d="$(git --no-pager diff --ignore-cr-at-eol $x)"


if [ "$d" ]; then
echo "$x NOT IDENTICAL"
else
echo "$x IDENTICAL"
# uncomment the next line to undo the line ending changes
# git checkout $x
fi
done