문제

나는 Git의 Windows/Linux 라인 끝 문제에 물렸다. Github, Msysgit 및 기타 소스를 통해 가장 좋은 솔루션은 Linux 스타일의 라인 엔딩을 사용하도록 로컬 리포지를 설정하는 것입니다. core.autocrlf 에게 true. 불행히도, 나는 이것을 충분히 일찍하지 않았으므로 지금은 잡아 당길 때마다 선 엔딩이 borked됩니다.

나는 대답을 찾았다 고 생각했다 여기 그러나 나는 그것이 나를 위해 일할 수 없다. Linux Command Line 지식은 기껏해야 제한되어 있으므로 스크립트에서 "Xargs FromDos"라인이 무엇을하는지조차 확신하지 못합니다. 나는 그러한 파일이나 디렉토리에 대한 메시지를 계속받지 못하고 기존 디렉토리를 가리킬 때 권한이 없다는 것을 알려줍니다.

Windows와 Mac OS X 터미널을 통해 MSYSGIT로 이것을 시도했습니다.

도움이 되었습니까?

해결책

GIT 문서 gitattributes 이제 프로젝트의 모든 라인 엔딩을 "고정"하거나 정규화하는 또 다른 접근 방식을 문서화합니다. 여기에는 요점이 있습니다.

$ echo "* text=auto" >.gitattributes
$ git add --renormalize .
$ git status        # Show files that will be normalized
$ git commit -m "Introduce end-of-line normalization"

정규화되지 않아야 할 파일이 git 상태로 표시되면 Git Add -U를 실행하기 전에 텍스트 속성을 설정하지 마십시오.

manual.pdf -text

반대로, GIT가 감지하지 않는 텍스트 파일은 수동으로 정규화를 활성화 할 수 있습니다.

weirdchars.txt text

이것은 새로운 것을 활용합니다 --renormalize 2018 년 1 월에 출시 된 GIT v2.16.0에 플래그가 추가되었습니다. 기존 버전의 GIT의 경우 몇 가지 단계가 더 있습니다.

$ echo "* text=auto" >>.gitattributes
$ rm .git/index     # Remove the index to force git to
$ git reset         # re-scan the working directory
$ git status        # Show files that will be normalized
$ git add -u
$ git add .gitattributes
$ git commit -m "Introduce end-of-line normalization"

다른 팁

이 문제를 해결하는 가장 쉬운 방법은 모든 라인 엔딩을 수정하는 커밋을 만드는 것입니다. 수정 된 파일이 없다고 가정하면 다음과 같이 수행 할 수 있습니다.

# From the root of your repository remove everything from the index
git rm --cached -r .

# Change the autocrlf setting of the repository (you may want 
#  to use true on windows):
git config core.autocrlf input

# Re-add all the deleted files to the index
# (You should get lots of messages like:
#   warning: CRLF will be replaced by LF in <file>.)
git diff --cached --name-only -z | xargs -0 git add

# Commit
git commit -m "Fixed crlf issue"

# If you're doing this on a Unix/Mac OSX clone then optionally remove
# the working tree and re-check everything out with the correct line endings.
git ls-files -z | xargs -0 rm
git checkout .

라인 엔딩을 다루는 내 절차는 다음과 같습니다 (많은 저장소에서 테스트 된 전투).

새로운 repo를 만들 때 :

  • 놓다 .gitattributes 다른 일반적인 파일과 함께 첫 번째 커밋에서 .gitignore 그리고 README.md

기존 repo를 다룰 때 :

  • 생성 / 수정 .gitattributes 따라서
  • git commit -a -m "Modified gitattributes"
  • git rm --cached -r . && git reset --hard && git commit -a -m 'Normalize CRLF' -n"
    • -n (--no-verify 사전 커밋 후크를 건너 뛰는 것입니다)
    • 나는 그것을 별칭으로 정의 할 정도로 자주해야한다. alias fixCRLF="..."
  • 이전 명령을 반복하십시오
    • 그렇습니다. 부 일반적으로 새로운 커밋이 생성되지 않을 때까지 반복하는 것이 가장 좋습니다. :)
  • 기존 (정규화 직전)과 새 지점 사이를 몇 번 앞뒤로 이동하십시오. 지점을 전환 한 후 때때로 GIT는 재 정규화 해야하는 더 많은 파일을 찾을 수 있습니다!

~ 안에 .gitattributes 나는 모든 텍스트 파일을 lf eol을 가지고 있다고 명시 적으로 선언합니다. 일반적으로 Windows 툴링은 LF와 호환되므로 Windows가 아닌 툴링은 CRLF와 호환되지 않습니다. (많은 nodejs 명령 줄 도구조차도 LF를 가정하므로 파일의 EOL을 변경할 수 있습니다).

의 내용 .gitattributes

나의 .gitattributes 일반적으로 다음과 같습니다.

*.html eol=lf
*.js   eol=lf
*.json eol=lf
*.less eol=lf
*.md   eol=lf
*.svg  eol=lf
*.xml  eol=lf

현재 Repo에서 Git에 의해 어떤 별도의 확장이 추적되는지 알아 내기 위해 이봐

정규화 후 문제

이 작업이 완료되면 더 일반적인 경고가 하나 더 있습니다.

당신을 말하십시오 master 이미 최신 상태이고 정규화되었으며 체크 아웃합니다. outdated-branch. 그 분기를 확인한 직후에 Git은 많은 파일을 수정 한 것으로 표시합니다.

해결책은 가짜 커밋을하는 것입니다 (git add -A . && git commit -m 'fake commit') 그리고 git rebase master. Rebase 후에는 가짜 커밋이 사라져야합니다.

git status --short|grep "^ *M"|awk '{print $2}'|xargs fromdos

설명:

  • git status --short

    이것은 git의 각 선을 표시하고 알지 못합니다. git 컨트롤에 있지 않은 파일은 '?'와 라인의 시작 부분에 표시됩니다. 수정 된 파일은 M으로 표시됩니다.

  • grep "^ *M"

    이것은 수정 된 파일 만 필터링합니다.

  • awk '{print $2}'

    이것은 마커가없는 파일 이름 만 보여줍니다.

  • xargs fromdos

    이것은 이전 명령의 파일 이름을 가져 와서 유틸리티 'FromDos'를 통해 라인 끝을 변환합니다.

다음은 전체 역사에서 모든 라인 엔딩을 사용하여 사용하는 방법입니다. git filter-branch. 그만큼 ^M 문자를 사용하여 입력해야합니다 CTRL-V + CTRL-M. 나는 사용했다 dos2unix 이후 파일을 변환하려면 이진 파일을 자동으로 미동시킵니다.

$ git filter-branch --tree-filter 'grep -IUrl "^M" | xargs -I {} dos2unix "{}"'

"| xargs fromdos"는 표준 입력에서 읽습니다 (파일 find 찾기) 명령에 대한 인수로 사용합니다. fromdos, 라인 엔딩을 변환합니다. (그 환경에서 Fromdos 표준입니까? 나는 dos2unix에 익숙합니다). XARGS 사용을 피할 수 있습니다 (특히 XARGS에 대해 인수 목록이 너무 길어질 수있는 충분한 파일이있는 경우 특히 유용합니다).

find <path, tests...> -exec fromdos '{}' \;

또는

find <path, tests...> | while read file; do fromdos $file; done

귀하의 오류 메시지가 완전히 확실하지 않습니다. 이 방법을 성공적으로 테스트했습니다. 각각 어떤 프로그램을 제작하고 있습니까? 어떤 파일/디렉토리에 대한 권한이 없습니까? 그러나 다음은 다음과 같은 것을 추측하는 데 찔린 것입니다.

스크립트의 '파일을 찾지 못한'오류를 가져 오는 쉬운 방법 중 하나는 상대 경로를 사용하는 것입니다. 절대 경로를 사용하십시오. 마찬가지로 스크립트 실행 가능 (CHMOD +X)을 만들지 않은 경우 권한 오류가 발생할 수 있습니다.

댓글을 추가하면 시도해 보도록 도와 드리겠습니다.

좋아 ... Cygwin 아래에 우리는 쉽게 구할 수 없으며, 수정 된 파일 (우리가 가진)의 경로에 공간이 있으면 어색한 Subseb가 얼굴에 날아갑니다.

git status --short | grep "^ *M" | sed 's/^ *M//' | xargs -n 1 dos2unix

이 솔루션의 대부분을 위해 @lloyd에게 Kudos

다른 답변이 당신에게 효과가 없다면 다음 단계를 따르십시오.

  1. 당신이 창문에 있다면,하십시오 git config --global core.autocrlf true; 당신이 유닉스에 있다면,하십시오 git config core.autocrlf input
  2. 운영 git rm --cached -r .
  3. 파일을 삭제하십시오 .gitattributes
  4. 운영 git add -A
  5. 운영 git reset --hard

그러면 지금 현지인이 깨끗해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top