2013-12-10 48 views
23

我如何Git的狀態忽略行尾/完全相同的文件/ Windows和Linux環境/保管箱/ MLED

git status

忽略行結束差異?

背景信息:

我隨機使用Windows和Linux來處理項目。該項目在Dropbox中。

我發現很多關於如何使git diff忽略行結尾。由於我使用融合git diff打開每個文件的meld。而融合說「相同的文件」。

那麼我該如何避免這種情況。 Git只能打開已更改文件的組合。 如果只有文件結尾不一樣,那麼git狀態不應報告更改的文件。

編輯:原因:

發生這種情況是因爲在Windows

core.autocrlf true

此設置的所以我檢查了Linux上的工作副本,並設置core.autocrlf假在Windows上。

知道如何讓git狀態忽略不同的新行,這仍然很不錯。

+2

有空間,如果你共享使用Dropbox在不同平臺上的文件,除非明確指出,否則會發生這種情況將git把所有文件視爲二進制文件。適當的解決方案是**不要使用Dropbox ** git存儲庫 – Petesh

+0

記住你:http://stackoverflow.com/questions/2825428/why-should-i-use-core-autocrlf-true-in-git - this可能會有所幫助 – Petesh

+0

我發現它如何與Dropbox配合使用:通過設置core.autocrlf false –

回答

22

嘗試設置這樣的core.autocrlf值:

git config --global core.autocrlf true 
+10

nope這是問題的根源 –

+1

@ThorstenNiehues我在某些工作項目上使用該設置。在工作上,我必須使用Windows,我使用Mac和Linux。在此之前,我遇到了和你一樣的問題,之後設置一切正常。 –

+0

這很奇怪,因爲Windows上的簽出只在Linux上有\ r \ n行結尾\ n您是否在Dropbox(或類似的)中都有工作副本? –

23

使用.gitattributes代替,具有以下設置:

# Ignore all differences in line endings 
*  -crlf 

.gitattributes將在同一目錄下的全球被發現。 gitconfig。如果.gitattributes不存在,請將其添加到該目錄。在添加/更改.gitattributes之後,您必須對存儲庫進行硬重置,才能成功將更改應用到現有文件。

+0

它在一個流中對我有效,但是當我嘗試在另一個流中爲同一個項目創建它時,它仍顯示Newline差異。 – pfernandom

+1

@pfernandom,你的項目中可能有多個.gitattributes嗎?它會首先查看最「本地」版本,所以如果你在本地目錄中有一個文件,它將在你的項目範圍內使用該目錄。 – Trashman

+0

-crlf之前需要8個空格嗎? – Igonato

3

我同時使用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 
+2

也許你可以使用「git diff -b」來查看每個文件的變化excel空白的變化 – Ivan

2

我創建了一個腳本以忽略行尾的區別:

它會顯示未添加到提交列表並進行了修改(忽略的差異後的文件行尾)。您可以添加參數「添加」以將這些文件添加到提交中。

#!/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:當文件在文件名或目錄
+0

謝謝!這是我能得到真正的區別的唯一方法。還有就是,隨着印刷3線發生了問題,表現出這樣的錯誤: SH:1:語法錯誤:未結束的引號的字符串 – evandro777

+1

一種腳本問題的修復: 問題: 如果文件有空間在文件名OU目錄,git將使用「」,所以腳本中斷。 解決方法是更改​​此行: my @mods ='git status --porcelain 2>/dev/null | grep'^ M'| awk'{print \ $ 2}''; 對此: my @mods ='git status --porcelain 2>/dev/null | grep'^ M'| cut -c4-'; – evandro777

+0

@ evandro777:謝謝!我已經更新了答案和git代碼。 – lepe