Git status忽略行尾/相同文件/ windows & linux环境/ dropbox / meld

n1bvdmb6  于 2022-12-14  发布在  Windows
关注(0)|答案(8)|浏览(210)

我如何使
git状态
是否忽略行尾差异?
背景信息:
我随机使用Windows和Linux来做这个项目。这个项目在Dropbox中。
我发现了很多关于如何让git diff忽略行尾的信息。因为我使用了meld,git diff会为每个文件打开meld。meld会说“相同的文件”。
那么我该如何避免这种情况呢?Git应该只为修改过的文件打开meld。如果只是文件结尾不同,Git状态应该不会报告文件已经修改。

编辑:原因:

发生这种情况的原因是Windows上的此设置
核心.autocrlf真
因此,我检查了Linux上的工作副本,并在Windows上设置core.autocrlf false。
如果知道如何让git status忽略不同的新行,那就更好了。

oyt4ldly

oyt4ldly1#

尝试如下设置core.autocrlf值:

git config --global core.autocrlf true
rseugnpd

rseugnpd2#

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

全球方法

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

git config --global core.autocrlf input

在Windows上配置Git行尾处理:

git config --global core.autocrlf true

按回购方式:

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

  • 正文
  • binary(Git不应该修改行尾的文件-因为这会导致一些图像类型,如PNG,无法在浏览器中呈现)

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

  • text-将行尾更改为操作系统本机行尾。
  • text eol=crlf- checkout 时将行尾转换为CRLF
  • text eol=lf- checkout 时将行尾转换为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
重新添加所有更改过的文件,并准备提交它们。这是检查哪些文件(如果有)未更改的机会。
x1米15英寸
在这里可以看到很多消息,上面写着“警告:文件中的CRLF将替换为LF。”
重写.gitattributes文件。
git add .gitattributes
将更改提交到存储库。
git commit -m "Normalize all the line endings"

e5njpo68

e5njpo683#

使用.gitattributes代替,并进行以下设置:

# Ignore all differences in line endings
*        -crlf

.gitattributes会和你的全局. gitconfig在同一个目录中。如果.gitattributes不存在,就把它添加到那个目录中。添加/更改.gitattributes后,你必须对仓库进行硬重置,才能成功地把更改应用到现有的文件。

k7fdbhmy

k7fdbhmy4#

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

$ git add --all

警告:LF将被CRLF替换...
文件的原始行尾将位于您的工作目录中。

分辨率

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

未出现任何警告消息。

xggvc2p6

xggvc2p65#

我同时使用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
mbyulnm0

mbyulnm06#

我创建了一个脚本来忽略行尾的差异:
它将显示那些没有被添加到提交列表中并且被修改过的文件(在忽略行尾的差异之后)。你可以添加参数“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修复:当文件的文件名或目录中有空间时
csga3l58

csga3l587#

我已经修改了+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
w6lpcovy

w6lpcovy8#

在vscode中,只要暂存所有项目即可-只有行尾不同的档案应该会消失,只留下内容不同的档案。然后您可以取消暂存,以取得预期的状态。

相关问题