programing

Git 상태 줄 끝 무시 / 동일한 파일 / Windows & Linux 환경 / 드롭박스 / mold

iphone6s 2023. 4. 27. 21:55
반응형

Git 상태 줄 끝 무시 / 동일한 파일 / Windows & Linux 환경 / 드롭박스 / mold

만드는 법

git 상태

줄 끝 차이를 무시하시겠습니까?

배경 정보:

저는 프로젝트 작업을 위해 임의로 Windows와 Linux를 사용합니다.프로젝트가 드롭박스에 있습니다.

git diff ignore 줄 끝을 어떻게 만드는지에 대해 많은 것을 발견했습니다.제가 각 파일에 대해 meldgit diff를 사용하기 때문에 meld를 엽니다.그리고 멜드는 "동일한 파일"이라고 말합니다.

어떻게 하면 이런 일을 피할 수 있을까요?Git는 변경된 파일에 대해서만 meld를 열어야 합니다.그리고 git 상태는 파일 끝만 다를 경우 파일이 변경된 것으로 보고되지 않습니다.

편집: 원인:

이 문제는 Windows의 이 설정 때문에 발생했습니다.

core.autoclf 참

그래서 리눅스에서 작업 복사본을 확인하고 코어를 설정했습니다.Windows에서 autocolf false.

git 상태가 다른 새 라인을 무시하도록 만드는 방법을 아는 것은 여전히 좋을 것입니다.

코어를 설정해 보십시오.다음과 같은 autocolf 값:

git config --global core.autocrlf true

OP가 다중 OS 솔루션의 필요성을 언급하기 때문에 이 답변은 적절해 보입니다.Github 도움말 문서에서는 OS 간에 끝나는 회선을 처리하는 데 사용할 수 있는 접근 방식에 대해 자세히 설명합니다.교차 OS 라인 종료를 관리하는 데는 글로벌 및 레포당 접근 방식이 있습니다.

글로벌 어프로치

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행 끝을 OS 기본 행 끝으로 변경합니다.
  • text eol=crlf선 끝을 다음으로 변환합니다.CRLF체크아웃 중인
  • text eol=lf선 끝을 다음으로 변환합니다.LF체크아웃 중인
  • text=auto라인 핸들을 Git의 재량에 맡기는 합리적인 기본값입니다.

다음은 샘플 .git 특성 파일의 내용입니다.

# 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로 대체됩니다"라는 메시지를 많이 볼 수 있습니다.

.git 특성 파일을 다시 씁니다.

git add .gitattributes

저장소에 변경 사항을 커밋합니다.

git commit -m "Normalize all the line endings"

대신 다음 설정을 사용하여 .git 특성을 사용합니다.

# Ignore all differences in line endings
*        -crlf

.git 특성은 글로벌 .gitconfig와 동일한 디렉토리에 있습니다..git 특성이 없으면 해당 디렉터리에 추가합니다..git 특성을 추가/변경한 후 기존 파일에 변경 사항을 성공적으로 적용하려면 저장소를 하드 리셋해야 합니다.

윈도우즈 운영 체제의 git 명령과 관련된 문제:

$ git add --all

경고: 다음에서 LF가 CRLF로 대체됩니다.

파일의 원래 줄 끝은 작업 디렉토리에 있습니다.

해상도:

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

경고 메시지가 나타나지 않습니다.

Linux를 은 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

줄 끝 부분의 차이를 무시하는 스크립트를 만들었습니다.

그러면 커밋 목록에 추가되지 않고 수정된 파일이 표시됩니다(줄 끝 부분의 차이를 무시한 후)."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

업데이트:

  • fix by evandro777 : 파일 이름이나 디렉터리에 공간이 있을 때

vscode에서는 모든 것을 스테이징합니다. 줄 끝만 다른 파일은 사라지고 내용이 다른 파일만 남깁니다.그런 다음 단계를 해제하여 원하는 상태로 이동할 수 있습니다.

+shukshin.ivan 스크립트를 약간 변경했습니다 - windows / linux line ending을 무시합니다.

#!/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

언급URL : https://stackoverflow.com/questions/20496084/git-status-ignore-line-endings-identical-files-windows-linux-environment

반응형