Git 状态忽略行尾 / 相同文件 / Windows & Linux 环境 / dropbox / meld



如何制作

git状态

忽略行尾差异?

背景信息:

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

我发现了很多关于如何让gitdiff忽略行结尾的知识。由于我使用了meld-git-diff,所以会为每个文件打开meld。梅尔德说"相同的文件"。

那么我该如何避免这种情况呢。Git应该只为更改的文件打开meld。如果只有文件结尾不同,git status不应将文件报告为已更改。

编辑:原因:

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

core.autocrlf真实

所以我在Linux上查看了工作副本,并在Windows上设置了core.autocrlf false。

如果知道如何使git状态忽略不同的新行,那还是很好的。

试着这样设置core.autocrlf值:

git config --global core.autocrlf true

这个答案似乎是相关的,因为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

有关如何在此处更改行尾设置后刷新回购的更多信息。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"

使用.gitattributes,并使用以下设置:

# Ignore all differences in line endings
*        -crlf

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

在Windows操作系统上发布与git命令相关的

$ git add --all

警告:LF将在…中被CRLF取代。。。

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

分辨率

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

没有出现任何警告信息。

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

它将显示未添加到提交列表中并已修改的文件(忽略行结尾的差异后)。您可以添加参数"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和linux,但解决方案core.autocrlf true对我没有帮助。在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

在vscode中,只需暂存所有内容-仅以行结尾不同的文件应该消失,只留下内容不同的文件。然后,您可以卸下舞台,到达您期望的状态。

我对+shukshin.ivan脚本进行了一些更改,以忽略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

在窗口中,将autocrlf设置为true:

git config --global core.autocrlf true

但这只会影响新文件。已触摸的文件仍将以修改后的git状态显示(即使更改仅以行尾显示)

为了避免这种情况,请保留您的本地更改。

git stash

应用回:

git stash apply

当更改被重新应用时,git将被重新索引,并且git将正确地处理行尾。希望这能帮助

最新更新