Trạng thái git bỏ qua phần cuối dòng / tệp giống hệt nhau / môi trường windows & linux / dropbox / mled


112

Tôi làm như thế nào

trạng thái git

bỏ qua sự khác biệt kết thúc dòng?

Thông tin cơ bản:

Tôi sử dụng ngẫu nhiên Windows và Linux để làm việc trong dự án. Dự án nằm trong Dropbox.

Tôi đã tìm thấy rất nhiều về cách làm cho git diff bỏ qua kết thúc dòng. Vì tôi sử dụng meld nên git nên meld sẽ mở ra meld cho mỗi tệp. Và meld nói "tệp giống hệt nhau".

Vậy làm cách nào để tránh điều này. Git chỉ nên mở meld cho các tệp đã thay đổi. Và trạng thái git không nên báo cáo các tệp là đã thay đổi nếu chỉ có phần cuối tệp là khác.

CHỈNH SỬA: Nguyên nhân:

Điều này xảy ra do cài đặt này trên Windows

core.autocrlf true

Vì vậy, tôi đã kiểm tra bản sao hoạt động trên Linux và đặt core.autocrlf false trên Windows.

Sẽ rất hay nếu bạn biết cách làm cho trạng thái git bỏ qua các dòng mới khác nhau.


3
Nếu bạn đang chia sẻ tệp bằng dropbox trên các nền tảng khác nhau, điều này sẽ xảy ra trừ khi bạn nói rõ ràng git coi tất cả các tệp là tệp nhị phân. Các giải pháp thích hợp là không sử dụng dropbox cho kho git
Petesh

nhớ bạn: stackoverflow.com/questions/2825428/… - điều này có thể giúp ích phần nào
Petesh

Tôi đã tìm ra cách nó hoạt động tốt với Dropbox: bằng cách đặt core.autocrlf false
Thorsten Niehues 12/1213

3
AFAIK yêu cầu git coi các tệp là tệp nhị phân cũng có tác dụng phụ là thay đổi cách nó khác biệt tệp. Giải pháp thích hợp là yêu cầu git bỏ qua phần cuối của dòng. 2 những điều yêu thích nhất của tôi: đối phó với dòng kết thúc vấn đề và quái gở của FUD không cần thiết về cách mọi người thiết lập các hợp đồng mua của họ lên :)
dầu thánh

Chà, tôi đã mất một lúc cho vấn đề core.autocrlfnày là nguyên nhân gốc rễ trên Windows, nhưng cũng là cách chữa trên Linux. Vấn đề là, autocrlflà toàn cầu trên Windows và repo không có cài đặt đó .git/config. Bằng cách chạy cục bộ, git config core.autocrlf truetôi đã loại bỏ các thay đổi giả trên bản sao làm việc NTFS của mình được sao chép trên Windows nhưng được truy cập trên Linux. (bây giờ chỉ có thay đổi giả mạo với symlink - symlink NTFS LÀM VIỆC trên gắn kết fuseblk, nhưng Git nhìn thấy chúng được sửa đổi ...)
Tomasz Gandor

Câu trả lời:


103

Hãy thử đặt giá trị core.autocrlf như sau:

git config --global core.autocrlf true

6
@ThorstenNiehues Tôi sử dụng cài đặt đó trong một số dự án công việc. Đi làm thì phải dùng windows, ở nhà thì dùng mac và linux. Trước đây tôi đã gặp vấn đề giống như bạn, sau khi thiết lập mọi thứ đều ổn.
Saša Šijak

1
Thật kỳ lạ vì thanh toán trên windows chỉ có \ r \ n kết thúc dòng trên Linux \ n Bạn có cả hai bản sao làm việc trong Dropbox (hoặc tương tự) không?
Thorsten Niehues 13/1213

1
@ThorstenNiehues Không, kho lưu trữ git nằm trên github. Hmm, có lẽ dropbox bằng cách nào đó đang gặp trục trặc với phần cuối dòng khi nó đồng bộ hóa tệp? Có vẻ lạ khi sử dụng dropbox cho git. Hãy thử sử dụng bitbucket (nó có kho lưu trữ riêng miễn phí), chỉ cần tạo một kho nhỏ và thử nghiệm trên 2 máy của bạn với một số tệp văn bản nhỏ.
Saša Šijak

1
1. Bản sao làm việc và repo địa phương là trong Dropbox (Tôi không cần một kho lưu trữ công cộng) mà có thể là sự khác biệt
Thorsten Niehues

3
Trong Windows: core.autocrlf truelà một cài đặt hoạt động trong CygWin. core.safecrlf falselà một khung cảnh làm việc trong bash git hoặc mingw
DrumM

43

Sử dụng .gitattributes thay thế, với cài đặt sau:

# Ignore all differences in line endings
*        -crlf

.gitattributes sẽ được tìm thấy trong cùng thư mục với .gitconfig toàn cầu của bạn. Nếu .gitattributes không tồn tại, hãy thêm nó vào thư mục đó. Sau khi thêm / thay đổi .gitattributes, bạn sẽ phải thực hiện khôi phục cài đặt gốc kho lưu trữ để áp dụng thành công các thay đổi cho các tệp hiện có.


Nó hoạt động với tôi trong một luồng, nhưng khi tôi cố gắng tạo nó trong một luồng khác cho cùng một dự án, nó vẫn cho thấy sự khác biệt của Dòng mới.
pfernandom

1
@pfernandom, bạn có thể có nhiều .gitatt thuộc tính trong dự án của mình không? Trước tiên, nó sẽ xem xét phiên bản "cục bộ" nhất, vì vậy nếu bạn có một phiên bản trong thư mục cục bộ chứa các tệp, nó sẽ sử dụng phiên bản đó trên toàn bộ dự án của bạn.
Trashman

Nó có cần phải có 8 khoảng trắng trước -crlf không?
Igonato

Không nên quan trọng
Trashman

Điều này không chỉ bỏ qua các kết thúc dòng cho git status. Nó thực sự thay đổi cách các tệp được kiểm tra vào kho lưu trữ. ref: git-scm.com/docs/gitattributes#_code_text_code
Vince

30

Câu trả lời này có vẻ phù hợp vì OP đề cập đến nhu cầu về giải pháp đa hệ điều hành. Bài viết trợ giúp Github này trình bày chi tiết các phương pháp có sẵn để xử lý các dòng kết thúc chéo hệ điều hành. Có các phương pháp tiếp cận toàn cầu và theo từng kho để quản lý kết thúc dòng chéo hệ điều hành.

Cách tiếp cận toàn cầu

Định cấu hình xử lý phần cuối dòng Git trên Linux hoặc OS X:

git config --global core.autocrlf input

Định cấu hình xử lý phần cuối dòng Git trên Windows:

git config --global core.autocrlf true

Cách tiếp cận mỗi repo:

Trong thư mục gốc của repo của bạn, tạo ra một .gitattributestập tin và xác định cài đặt dòng kết thúc cho các tập tin dự án của bạn, một dòng tại một thời điểm trong các định dạng sau: path_regex line-ending-settingsnơi line-ending-settingslà một trong những điều sau đây:

  • bản văn
  • nhị phân (các tệp mà Git không nên sửa đổi phần cuối dòng)

Các textgiá trị có thể được cấu hình hơn nữa để hướng dẫn Git về cách xử lý kết thúc dòng cho các tập tin phù hợp:

  • text - Thay đổi phần cuối dòng thành phần cuối dòng gốc của OS.
  • text eol=crlf- Chuyển đổi kết thúc dòng thành CRLFkhi thanh toán.
  • text eol=lf- Chuyển đổi kết thúc dòng thành LFkhi thanh toán.
  • text=auto - Mặc định hợp lý để xử lý dòng tùy theo quyết định của Git.

Đây là nội dung của một tệp .gitattributes mẫu:

# 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

Tìm hiểu thêm về cách làm mới repo của bạn sau khi thay đổi cài đặt kết thúc dòng tại đây . Tldr:

sao lưu các tệp của bạn với Git, xóa mọi tệp trong kho lưu trữ của bạn (ngoại trừ thư mục .git), sau đó khôi phục tất cả các tệp cùng một lúc. Lưu các tệp hiện tại của bạn trong Git để không có tác phẩm nào của bạn bị mất.

git add . -u

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

Xóa chỉ mục và buộc Git quét lại thư mục đang làm việc.

rm .git/index

Viết lại chỉ mục Git để chọn tất cả các kết thúc dòng mới.

git reset

Hiển thị các tệp được viết lại, chuẩn hóa.

Trong một số trường hợp, đây là tất cả những gì cần phải làm. Những người khác có thể cần phải hoàn thành các bước bổ sung sau:

git status

Thêm lại tất cả các tệp đã thay đổi của bạn và chuẩn bị cho một cam kết. Đây là cơ hội để bạn kiểm tra xem tệp nào, nếu có, không thay đổi.

git add -u

Hoàn toàn an toàn khi thấy nhiều thông báo ở đây có nội dung [s] "cảnh báo: CRLF sẽ được thay thế bằng LF trong tệp."

Viết lại tệp .gitattributes.

git add .gitattributes

Cam kết các thay đổi đối với kho lưu trữ của bạn.

git commit -m "Normalize all the line endings"


18

Sự cố liên quan đến lệnh git trên hệ điều hành Windows:

$ git add --all

cảnh báo: LF sẽ được thay thế bằng CRLF trong ...

Tệp sẽ có phần cuối dòng ban đầu trong thư mục làm việc của bạn.

Độ phân giải :

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

Không có bất kỳ thông báo cảnh báo nào xuất hiện.


bạn nên làm điều này trong tất cả các hệ điều hành bạn đang sử dụng, tức là: trong windows và linux. Rember mỗi hệ điều hành có tệp .git / config chung của riêng nó, vì vậy bạn cần đặt các cài đặt đó hoạt động tương tự. Đây là lý do tại sao @Thorsten bạn đang gặp sự cố. Nhưng tôi đặt cờ thành true thay vì false.
Emmanuel Mahuni

Giải pháp này cũng hoạt động trong Linux (các @ SašaŠijak Câu trả lời không làm việc cho tôi)
Júlio César Soares Espíndola

4

Tôi đã tạo một tập lệnh để bỏ qua sự khác biệt trong các kết thúc dòng:

Nó sẽ hiển thị các tệp không được thêm vào danh sách cam kết và đã được sửa đổi (sau khi bỏ qua sự khác biệt về phần cuối dòng). Bạn có thể thêm đối số "add" để thêm các tệp đó vào cam kết của mình.

#!/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`;
        }
    }
}

Mã nguồn: https://github.com/lepe/scripts/blob/master/gitdiff.pl

Cập nhật :

  • fix by evandro777: Khi tệp có khoảng trống trong tên tệp hoặc thư mục

Cảm ơn! Đó là cách duy nhất tôi có thể nhận được sự khác biệt thực sự. Có chỉ là một vấn đề đã xảy ra với 3 dòng in, cho thấy lỗi này: sh: 1: Lỗi cú pháp: chưa hoàn tất được trích dẫn chuỗi
evandro777

1
Khắc phục sự cố tập lệnh: Sự cố: Khi tệp có khoảng trống trong thư mục ou tên tệp, git sẽ sử dụng "", do đó tập lệnh bị hỏng. Cách khắc phục là thay đổi dòng này: my @mods = git status --porcelain 2>/dev/null | grep '^ M ' | awk '{ print \$2 }'; cho cái này: @mods của tôi = git status --porcelain 2>/dev/null | grep '^ M ' | cut -c4-;
evandro777

@ evandro777: Cảm ơn! Tôi đã cập nhật cả hai, câu trả lời và mã git.
lepe

3

Tôi sử dụng cả windows và linux, nhưng giải pháp core.autocrlf truekhông giúp được tôi. Tôi thậm chí không có gì thay đổi sau đó git checkout <filename>.

Vì vậy, tôi sử dụng giải pháp thay thế 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

Tôi chỉ so sánh md5sumgiữa một tệp và người anh em của nó tại kho lưu trữ.

Ví dụ đầu ra:

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

2
có lẽ bạn có thể sử dụng "git diff -b" cho mỗi tệp để kiểm tra các thay đổi thay đổi khoảng trắng trên excel
Ivan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.