커밋하기 전에 자식이 후행 공백을 자동으로 제거하도록하십시오.


220

팀과 함께 git을 사용하고 있으며 diff, log, merge 등에서 공백 변경 사항을 제거하고 싶습니다.이 작업을 수행하는 가장 쉬운 방법은 git이 후행 공백 (및 기타 공백 오류)을 자동으로 제거하는 것이라고 가정합니다 ) 적용되는 모든 커밋에서.

~/.gitconfig파일로 다음을 추가하려고했지만 커밋 할 때 아무것도하지 않습니다. 어쩌면 다른 무언가를 위해 설계되었을 수도 있습니다. 해결책은 무엇입니까?

[core]
    whitespace = trailing-space,space-before-tab
[apply]
    whitespace = fix

누구든지 루비 관련 아이디어가있는 경우를 대비하여 루비를 사용하고 있습니다. 커밋하기 전에 자동 코드 형식화는 다음 단계이지만, 어려운 문제이며 실제로 큰 문제를 일으키지 않습니다.


core.whitespace 지시문으로 문제가 해결되지 않으면 사전 커밋 후크 (.git / hooks / pre-commit)를 변경하여 찾아서 해결할 수도 있습니다. 자세한 설명 은 게시물을 참조하십시오 .
VolkA

2
비슷한 공백 오류와 부분 솔루션에 좌절하고 유연하고 상당히 기능이 완벽한 유틸리티를 작성하여 악마 버전 제어 시스템에 해당하는 공백 오류를 수정 하거나 간단히보고 할 수 있습니다 : Github의 공백 총 수정 자 (이것은 너무 자기 홍보 인 경우 사과)
Dan Lenski

답변:


111

이러한 설정 ( core.whitespaceapply.whitespace)은 후행 공백을 제거하지 않고 다음을 수행합니다.

  • core.whitespace: 감지하여 오류 발생
  • apply.whitespace: 항상 "자동으로"가 아닌 패치 중에 만 제거하십시오.

나는 그것을 위해 git hook pre-commit더 나은 일을 할 것이라고 믿는다 (후행 공백 제거 포함)


주어진 시간에 pre-commit후크를 실행하지 않도록 선택할 수 있습니다 .

  • 일시적으로 : git commit --no-verify .
  • 영구적으로 : cd .git/hooks/ ; chmod -x pre-commit

경고 : 기본, a로 pre-commit(같은 스크립트 이 하나 ), 한 없는 기능 "을 후행 제거" "하지만,"경고 "기능과 같은 :

if (/\s$/) {
    bad_line("trailing whitespace", $_);
}

그러나 특히 다음을 고려할 때 더 나은 pre-commit후크를 만들 수 있습니다.

준비 영역에 약간의 변경 사항 만 추가하여 Git에서 커밋하면 여전히 작업 복사본으로 존재하지 않았거나 작동하지 않을 수 있는 "원자"개정이 생성 됩니다.


예를 들어, 노인다른 대답 에서 공백을 감지하고 제거 하는 pre-commit후크 를 제안합니다 .
그 후크는 각 파일의 파일 이름을 얻으므로 특정 유형의 파일에주의를 기울이는 것이 좋습니다. .md(마크 다운) 파일 에서 후행 공백을 제거하고 싶지 않습니다 !


1
apply.whitespacegit을 통해 작업 복사본 변경 사항을 패치로 처리하도록 git을 속여서 작업 복사본의 공백을 수정하도록 확신 할 수 있습니다 . 아래 내 답변을 참조하십시오 .
ntc2

> ".md (마크 다운) 파일에서 후행 공백을 제거하고 싶지 않습니다"-왜 그런가요? 마크 다운 파일에서 공백의 목적은 무엇입니까? 일부 .editorconfig파일에는 특정 규칙이 있습니다.
friederbluemle

5
@friederbluemle 마크 다운 유형에 따라 후행 공백이 나타납니다 <br>. github.com/FriendsOfPHP/PHP-CS-Fixer/issues/…
VonC

설정 core.whitespacetrailing-space가진 것은 git config에 투입 할 때 오류가 발생하지 않습니다 git2.5.0.
Karl Richter

43

변경 사항을 패치로 처리하도록 Git을 속여서 Git이 공백을 수정하도록 속일 수 있습니다. "사전 커밋 후크"솔루션과 달리이 솔루션은 Git에 공백 수정 명령을 추가합니다.

예, 이것은 해킹입니다.


강력한 솔루션

다음 Git 별칭은 my~/.gitconfig 에서 가져옵니다 .

"견고한"이란 트리 나 인덱스가 더티인지에 관계없이 이러한 별칭이 오류없이 실행되고 올바른 작업을 수행함을 의미합니다. 그러나 대화식 git rebase -i이 이미 진행중인 경우 작동하지 않습니다 . 마지막에 설명 된 트릭이 작동하는 이 코너 케이스에 관심이 있다면 추가 확인을 위해 ~/.gitconfig 참조하십시오 git add -e.

Git 별칭을 만들지 않고 쉘에서 직접 실행하려면 큰 따옴표 사이에 모든 것을 복사하여 붙여 넣으십시오 (쉘이 Bash와 같다고 가정).

색인을 수정하지만 트리는 수정하지 마십시오

다음 fixwsGit 별칭은 인덱스의 모든 공백 오류를 수정하지만 트리를 건드리지 않습니다.

# Logic:
#
# The 'git stash save' fails if the tree is clean (instead of
# creating an empty stash :P). So, we only 'stash' and 'pop' if
# the tree is dirty.
#
# The 'git rebase --whitespace=fix HEAD~' throws away the commit
# if it's empty, and adding '--keep-empty' prevents the whitespace
# from being fixed. So, we first check that the index is dirty.
#
# Also:
# - '(! git diff-index --quiet --cached HEAD)' is true (zero) if
#   the index is dirty
# - '(! git diff-files --quiet .)' is true if the tree is dirty
#
# The 'rebase --whitespace=fix' trick is from here:
# https://stackoverflow.com/a/19156679/470844
fixws = !"\
  if (! git diff-files --quiet .) && \
     (! git diff-index --quiet --cached HEAD) ; then \
    git commit -m FIXWS_SAVE_INDEX && \
    git stash save FIXWS_SAVE_TREE && \
    git rebase --whitespace=fix HEAD~ && \
    git stash pop && \
    git reset --soft HEAD~ ; \
  elif (! git diff-index --quiet --cached HEAD) ; then \
    git commit -m FIXWS_SAVE_INDEX && \
    git rebase --whitespace=fix HEAD~ && \
    git reset --soft HEAD~ ; \
  fi"

아이디어는 색인에 공백 오류가있는 경우 git fixws전에 실행하는 것입니다 git commit.

인덱스와 트리를 수정

다음 fixws-global-tree-and-indexGit 별명은 색인 및 트리의 모든 공백 오류를 수정합니다 (있는 경우).

# The different cases are:
# - dirty tree and dirty index
# - dirty tree and clean index
# - clean tree and dirty index
#
# We have to consider separate cases because the 'git rebase
# --whitespace=fix' is not compatible with empty commits (adding
# '--keep-empty' makes Git not fix the whitespace :P).
fixws-global-tree-and-index = !"\
  if (! git diff-files --quiet .) && \
     (! git diff-index --quiet --cached HEAD) ; then \
    git commit -m FIXWS_SAVE_INDEX && \
    git add -u :/ && \
    git commit -m FIXWS_SAVE_TREE && \
    git rebase --whitespace=fix HEAD~2 && \
    git reset HEAD~ && \
    git reset --soft HEAD~ ; \
  elif (! git diff-files --quiet .) ; then \
    git add -u :/ && \
    git commit -m FIXWS_SAVE_TREE && \
    git rebase --whitespace=fix HEAD~ && \
    git reset HEAD~ ; \
  elif (! git diff-index --quiet --cached HEAD) ; then \
    git commit -m FIXWS_SAVE_INDEX && \
    git rebase --whitespace=fix HEAD~ && \
    git reset --soft HEAD~ ; \
  fi"

버전이 지정되지 않은 파일에서 공백을 수정하려면

git add --intent-to-add <unversioned files> && git fixws-global-tree-and-index

단순하지만 강력한 솔루션

이러한 버전은 복사 및 붙여 넣기가 더 쉬워 지지만 해당 조건이 충족되지 않으면 올바른 작업을 수행하지 않습니다.

현재 디렉토리를 기반으로하는 하위 트리 수정 (비어 있지 않은 경우 인덱스 재설정)

git add -e아이디 편집기로 패치를 "편집"하는 데 사용 ::

(export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .) && git checkout . && git reset

색인 수정 및 보존 (트리가 더럽거나 색인이 비어있는 경우 실패)

git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset --soft HEAD~

나무와 색인을 수정하십시오 (그러나 비어 있지 않으면 색인을 재설정하십시오)

git add -u :/ && git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset HEAD~

export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .트릭의 설명

이 답변 에서 git rebase --whitespace=fix트릭 에 대해 배우기 전에 더 복잡한 트릭을 사용했습니다 .git add

우리가 수동으로 한 경우 :

  1. 설정 apply.whitespacefix(당신은 한 번만 수행하면) :

    git config apply.whitespace fix
    

    이것은 Git에게 패치 에서 공백을 수정하도록 지시 합니다.

  2. Git이 변경 사항을 패치 로 취급하도록 설득 하십시오 .

    git add -up .
    

    각 파일에 대한 모든 변경 사항을 선택하려면 a+ enter를 누르십시오 . Git의 공백 오류 수정에 대한 경고가 표시됩니다.
    ( git -c color.ui=auto diff이 시점에서 색인이 생성되지 않은 변경 사항은 정확히 공백 오류임을 나타냅니다).

  3. 작업 사본에서 공백 오류를 제거하십시오.

    git checkout .
    
  4. 변경 사항을 다시 가져 오십시오 (커밋 할 준비가되지 않은 경우).

    git reset
    

편집기 및 명령 GIT_EDITOR=:으로 사용 하는 수단 은 ID입니다.::


1
난 그냥 윈도우에서 그것을 테스트 : 잘 DOS 명령 프롬프트에이 작품 : set VISUAL= && git add -ue . && git checkout .'을 참고 .사용' git add: 그 때문에 git1.8.3의
VonC

@VonC VISUAL을 영구적으로 설정 해제하지 않습니까? 예를 들어 이후 git commit에 잘못된 편집기를 사용하게 될 수 있습니까? VISUAL=이 문제를 피하기 위해 위의 유닉스 버전에서 서브 쉘 의 일부를 포장 했지만 DOS에 서브 쉘이 있는지는 알 수 없습니다.
ntc2

1
해킹에 감사드립니다! 참고로 core.editor설정 한 VISUAL경우 구성 설정이에 우선하기 때문에 내보내기 가 적용되지 않습니다 man git-var. 이를 무시하려면 GIT_EDITOR=:대신 내 보내야합니다.
Nick Felt

1
또한 fixws대화 형 rebase에 이미있는 경우 내 버전의 버전이 빠르게 실패하도록 조정 했습니다. 그렇지 않으면 git rebase --whitespace=fix라인 에서 죽어 이상한 상태가됩니다. 나는 이 질문 에서 빌려 와 if 전에 추가 사례를 추가했습니다. fixws = !"\ if test -d $(git rev-parse --git-dir)/rebase-merge ; then \ echo 'In rebase - cannot fixws' ; \ elif (! git diff-files --quiet .) && \ (! git diff-index --quiet --cached HEAD) ; then \ ...
Nick Felt

1
참고 : I가 이것을하도록 사전 커밋 후크
이안 Kelling에게

29

후행 공백을 제거 하는 자식 사전 커밋 후크를 찾았습니다 .

#!/bin/sh

if git-rev-parse --verify HEAD >/dev/null 2>&1 ; then
   against=HEAD
else
   # Initial commit: diff against an empty tree object
   against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi
# Find files with trailing whitespace
for FILE in `exec git diff-index --check --cached $against -- | sed '/^[+-]/d' | sed -r 's/:[0-9]+:.*//' | uniq` ; do
   # Fix them!
   sed -i 's/[[:space:]]*$//' "$FILE"
   git add "$FILE"
done
exit

3
두 번째 sed호출 ( sed -r 's/:[0-9]+:.*//') 은로 대체 될 수 있습니다 cut -f1 -d:. 이것은 Linux 및 BSD 기반 플랫폼 모두에서 동일하게 작동합니다.
Ihor Kaharlichenko

2
@IhorKaharlichenko : 실제로 사용하는 cut것은 두 번째만큼 안전하지 않습니다 sed: ":"를 포함하는 파일 이름의 경우 ( 절대 가능성이 낮음) 잘라내 기가 실패합니다. awk 'NF>2{NF-=2}1'안전을 위해 사용할 수 있습니다
MestreLion

1
BTW, Windows (msysgit)에 있고를 사용하는 core.autocrlf=true경우 dos2unix -D "$FILE"sed 후 for 루프 내부 를 추가 할 수 있습니다 . 그렇지 않으면 sed 만 발행하여 모든 CRLF를 LF로 변경합니다.
jakub.g

49
git add커밋 훅 내부에서하는 것은 나에게 꽤 악한 것 같습니다. 파일의 부분 준비 / 커밋을 수행하는 경우 어떻게합니까? 완전한 파일을 등 뒤에서 커밋하지 않기를 원합니까?
Stefaan

19

Mac OS (또는 BSD)에서 sed 명령 매개 변수는 약간 달라야합니다. 이 시도:

#!/bin/sh

if git-rev-parse --verify HEAD >/dev/null 2>&1 ; then
   against=HEAD
else
   # Initial commit: diff against an empty tree object
   against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi

# Find files with trailing whitespace
for FILE in `exec git diff-index --check --cached $against -- | sed '/^[+-]/d' | sed -E 's/:[0-9]+:.*//' | uniq` ; do
    # Fix them!
    sed -i '' -E 's/[[:space:]]*$//' "$FILE"
    git add "$FILE"
done

이 파일을 다른 이름으로 저장 .git/hooks/pre-commit하거나 이미 존재하는 파일을 찾아서 그 안에 어딘가에 하단 청크를 붙여 넣습니다. 그리고 chmod a+x그것도 기억하십시오 .

또는 글로벌 사용 (경유 - 전역 설정 힘내 후크를 저지 당신이 그것을 넣을 수 있습니다) $GIT_PREFIX/git-core/templates/hooks(GIT_PREFIX에 / usr 또는 경우 / usr / local이나 / usr / 주 또는 / 옵션 / 지역 / 공유) 실행 git init기존의 repos 내부.

에 따르면 git help init:

기존 저장소에서 git init를 실행하는 것이 안전합니다. 이미 존재하는 것을 덮어 쓰지 않습니다. git init를 다시 실행하는 주된 이유는 새로 추가 된 템플릿을 선택하는 것입니다.


7
이 후크가 작업 파일을 수정하고 수정 된 작업 파일로 색인을 덮어 쓰지 않습니까? 인덱스를 구성하기 위해 'git add -p'한다면,이 커밋 훅은 그것을 날려 버릴 것입니다.
Matthew Dutton

2
네, 아마 그렇습니다. 사람이 사용하는 스크립트를 다시 작성해야 git hash-object -w하고 git update-index직접 인덱스에 munged 파일 삽입 (재)에 있습니다. 매우 용감한 사람.
AlexChaffee

11

차라리이 작업을 좋아하는 편집자에게 맡기고 싶습니다.

저장할 때 후행 공백을 제거하도록 명령을 설정하십시오.


2
정력에 당신은이 작업을 수행 할 수 있습니다 : autocmd BufWritePre의 cpp를, 이 .c, * 시간을 : % / \ s의 \ + $ // 전자.
로버트 Massaioli

3
죄송합니다. 테스트하기 전에 위의 의견을 찬성했습니다. 퍼센트 기호 다음에 누락 된 "s"가 있으며 공백이 있으면 커서를 움직이며 마지막 검색 패턴을 제거합니다. 더 나은 대안 은 vim.wikia.com/wiki/Remove_unwanted_spaces 를 참조하십시오 .
세스 존슨

1
이맥스에서는 Mx delete-trailing-whitespace입니다.
Mauvis Ledford

2
emacs의 경우 파일 에 추가 (add-hook 'before-save-hook 'delete-trailing-whitespace)하여 저장하기 전에 후행 공백을 삭제하는 후크를 설정하는 것이 .emacs좋습니다. 이맥스 공백 트릭
던컨 파크스

1
탭을 공백으로 변환하는 (추가 후크 '저장하기 전에'공백 정리 ')를 사용합니다.
Nils Fagerburg

10

자식 속성 사용 및 자식 설정으로 필터 설정

좋아, 이것은이 문제를 해결하기위한 새로운 방법입니다 ... 내 접근 방식은 후크를 사용하지 않고 필터와 자식 속성을 사용하는 것입니다. 이 기능을 사용하면 개발중인 각 컴퓨터에서 파일 끝에 커밋하기 전에 추가 공백과 줄을 제거하는 필터 세트가 설정됩니다. 그런 다음 필터를 적용 할 파일 형식을 나타내는 .gitattributes 파일을 설정하십시오. 필터에는 clean파일을 색인에 추가 할 때 적용되는 단계 와 smudge작업 디렉토리에 추가 할 때 적용되는 두 단계 가 있습니다.

자식에게 전역 속성 파일을 찾도록 지시하십시오.

먼저 전역 속성 파일을 사용하도록 전역 구성에 지시하십시오.

git config --global core.attributesfile ~/.gitattributes_global

글로벌 필터 만들기

이제 필터를 작성하십시오.

git config --global filter.fix-eol-eof.clean fixup-eol-eof %f
git config --global filter.fix-eol-eof.smudge cat
git config --global filter.fix-eol-eof.required true

sed 스크립팅 매직 추가

마지막으로, fixup-eol-eof스크립트를 경로 어딘가에 놓고 실행 가능하게 만드십시오. 스크립트는 sed를 사용하여 일부 편집 작업을 수행합니다 (파일 끝에서 공백과 공백을 제거하고 파일 끝에서 불필요한 공백을 제거합니다)

fixup-eol-eof는 다음과 같아야합니다.

#!/bin/bash
sed -e 's/[  ]*$//' -e :a -e '/^\n*$/{$d;N;ba' -e '}' $1

이것의 내 요지

git에게 새로 만든 필터를 적용 할 파일 형식을 알려주세요

마지막으로 좋아하는 편집기에서 ~ / .gitattributes_global을 만들거나 열고 다음과 같은 줄을 추가하십시오.

pattern attr1 [attr2 [attr3 […]]]

따라서 공백 문제를 해결하려면 모든 c 소스 파일에 대해 다음과 같은 줄을 추가하십시오.

*.c filter=fix-eol-eof

필터에 대한 토론

필터에는 두 가지 단계가 있습니다. 색인에 항목을 추가하거나 체크인 할 때 적용되는 정리 단계와 git이 작업 디렉토리에 항목을 넣을 때의 얼룩 단계입니다. 여기서 우리의 얼룩은 cat파일 끝에 후행 줄 바꿈 문자가 없으면 가능한 줄 바꿈 문자를 추가하는 것을 제외하고 는 명령을 통해 내용을 실행 합니다. clean 명령은 공백 필터링으로 http://sed.sourceforge.net/sed1line.txt의 노트와 함께 사용되었습니다 . 쉘 스크립트에 넣어야하는 것 같습니다. 파일 끝의 불필요한 여분의 줄을 git-config 파일에 직접 추가하는 등 sed 명령을 삽입하는 방법을 알 수 없었습니다. (당신 수 있습니다별도의 SED 스크립트의 필요없이, 그러나 후행 공백을 제거, 바로 설정 filter.fix-eol-eof같은 것으로 sed 's/[ \t]*$//' %f(가) 어디에 \t탭을 눌러, 실제 탭입니다.)

require = true는 문제가 발생하면 문제가 발생하지 않도록 오류를 발생시킵니다.

자식에 관한 언어가 정확하지 않은 경우 용서해주십시오. 나는 개념을 상당히 잘 알고 있다고 생각하지만 여전히 용어를 배우고 있습니다.


재미있는 접근법. +1
VonC

@VonC 감사합니다! 또한이 기회를 통해 git 속성을 .git전역이 아닌 폴더 에서 담당자별로 구성 할 수 있음을 지적하고 싶습니다 . 이는 더 의미가 있습니다.
zbeekman

9

대상 파일에 후행 공백이 너무 많으면 이전 제안에서 읽을 수없는 커밋을 만드는 경향이 있기 때문에 변경 / 추가 한 행에서 후행 공백 만 제거하는이 사전 커밋 후크를 작성했습니다.

#!/bin/sh

if git rev-parse --verify HEAD >/dev/null 2>&1 ; then
   against=HEAD
else
   # Initial commit: diff against an empty tree object
   against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi

IFS='
'

files=$(git diff-index --check --cached $against -- | sed '/^[+-]/d' | perl -pe 's/:[0-9]+:.*//' | uniq)
for file in $files ; do
    diff=$(git diff --cached $file)
    if test "$(git config diff.noprefix)" = "true"; then
        prefix=0
    else
        prefix=1
    fi
    echo "$diff" | patch -R -p$prefix
    diff=$(echo "$diff" | perl -pe 's/[ \t]+$// if m{^\+}')
    out=$(echo "$diff" | patch -p$prefix -f -s -t -o -)
    if [ $? -eq 0 ]; then
        echo "$diff" | patch -p$prefix -f -t -s
    fi
    git add $file
done

1
흥미 롭군 +1. 빈 트리를 계산하는 다른 대답 을 참조하십시오 .
VonC

1
좋은 생각입니다. 정확히 내가 원하는 것입니다. 그러나 이것을 사용할 때 조심하십시오! OSX 및 git 버전 2.3.5에서는 저에게 준비되었지만 커밋되지 않은 변경 사항이 사라졌습니다. 그래도 여전히 작동하는 솔루션에 관심이 있습니다.
캐스퍼

9

시도하십시오 사전을 커밋 후크 , 그것은 자동으로 후행 공백을 감지 할 수 있습니다 제거 . 감사합니다!

그것은 아래에서 작동 할 수 있습니다 GitBash(windows), Mac OS X and Linux!


스냅 사진:

$ git commit -am "test"
auto remove trailing whitespace in foobar/main.m!
auto remove trailing whitespace in foobar/AppDelegate.m!
[master 80c11fe] test
1 file changed, 2 insertions(+), 2 deletions(-)

1
흥미 롭군 +1. 나는 내 대답
VonC

@VonC 귀하의 확인에 감사드립니다! '.md'에게, 나는 단지 git commit -no-verify어떤 sususstions를 찾았습니까?
노인

.md최종 사용자에게에 --no-verify옵션 을 추가하도록 요청하는 대신 후크가 파일 을 감지 하고 공백을 제거하지 못하게 할 것 git commit입니다.
VonC

파일 / 디렉토리를 투입하면 실패로 시작 +또는-
RODY Oldenhuis

6

다음은 ubuntu + mac os x 호환 버전입니다.

#!/bin/sh
#

# A git hook script to find and fix trailing whitespace
# in your commits. Bypass it with the --no-verify option
# to git-commit
#

if git-rev-parse --verify HEAD >/dev/null 2>&1 ; then
  against=HEAD
else
  # Initial commit: diff against an empty tree object
  against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi
# Find files with trailing whitespace
for FILE in `exec git diff-index --check --cached $against -- | sed '/^[+-]/d' | (sed -r 's/:[0-9]+:.*//' > /dev/null 2>&1 || sed -E 's/:[0-9]+:.*//') | uniq` ; do
  # Fix them!
  (sed -i 's/[[:space:]]*$//' "$FILE" > /dev/null 2>&1 || sed -i '' -E 's/[[:space:]]*$//' "$FILE")
  git add "$FILE"
done

# Now we can commit
exit

즐기세요


당신과 내 것의 유일한 차이점은 파일을 다시 쓰기 전에 sed가 실제로 무언가를 대체하는지 확인하는 것입니다 ... git은 실제로 아무것도 변경하지 않는 변경 사항을 커밋하지 않기 때문에 중요하지 않습니다. 나는 그것이 조금 더 안전하지만 조금 느리다고 가정하고 정규 표현식을 한 줄에 두 번 반복하지 않는 선명도를 선호합니다. gustibus 비 분쟁 est!
AlexChaffee

차이점은 버전이 우분투 구문을 먼저 사용하고 (실패한 경우) osx 구문을 사용한다는 것입니다.
sdepold

1
sdepold의 게시물을 편집 했으므로 파일 이름에 공백을 허용 할 수 있어야합니다.
imme

5

오늘 이것에 대해 생각하고있었습니다. 이것은 내가 자바 프로젝트를 위해 끝내는 전부입니다.

egrep -rl ' $' --include *.java *  | xargs sed -i 's/\s\+$//g'

3

대한 숭고한 텍스트 사용자.

Setting-User 구성 에서 다음을 올바르게 설정하십시오 .

"trim_trailing_white_space_on_save": true


1
파일 유형별로 설정하는 방법입니까? 나는이 *.md간단한 마킹 (더블 후행 공백)에 의존 (가격 인하) 파일을 "" <br />, 그 설정에 적용하는 것 모두 내가 포함한 파일, 하지 후행 공백을 제거하고 싶습니다.
VonC 2016 년

@VonC 여기에 구성이 어떻게 적용되는지에 대한 계층 구조가 있습니다. stackoverflow.com/questions/16983328/… 도움이 되길 바랍니다
Haris Krajina

2

파일의 for-loop는 $ IFS 쉘 변수를 사용합니다. 주어진 스크립트에서 $ IFS- 변수에있는 문자가 포함 된 파일 이름은 for- 루프에서 두 개의 다른 파일로 표시됩니다. 이 스크립트는 수정했습니다 : 주어진 sed-manual과 같은 multiline-mode modifier는 우분투 상자에서 기본적으로 작동하지 않는 것 같습니다. 따라서 다른 구현을 찾았고 반복 레이블로 이것을 찾았습니다. 파일을 올바르게 이해했다면 파일의 마지막 줄입니다.

#!/bin/sh
#

# A git hook script to find and fix trailing whitespace
# in your commits. Bypass it with the --no-verify option
# to git-commit
#

if git rev-parse --verify HEAD >/dev/null 2>&1
then
    against=HEAD
else
    # Initial commit: diff against an empty tree object
    against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi

SAVEIFS="$IFS"
# only use new-line character as seperator, introduces EOL-bug?
IFS='
'
# Find files with trailing whitespace
for FILE in $(
    git diff-index --check --cached $against -- \
    | sed '/^[+-]/d' \
    | ( sed -r 's/:[0-9]+:.*//' || sed -E 's/:[0-9]+:.*//' ) \
    | uniq \
)
do
# replace whitespace-characters with nothing
# if first execution of sed-command fails, try second one( MacOSx-version)
    (
        sed -i ':a;N;$!ba;s/\n\+$//' "$FILE" > /dev/null 2>&1 \
        || \
        sed -i '' -E ':a;N;$!ba;s/\n\+$//' "$FILE" \
    ) \
    && \
# (re-)add files that have been altered to git commit-tree
#   when change was a [:space:]-character @EOL|EOF git-history becomes weird...
    git add "$FILE"
done
# restore $IFS
IFS="$SAVEIFS"

# exit script with the exit-code of git's check for whitespace-characters
exec git diff-index --check --cached $against --

[1] sed-subsition 패턴 : sed를 사용하여 줄 바꿈 (\ n)을 바꾸려면 어떻게해야합니까? .


2

커밋 전에 공백을 자동으로 제거하지는 않지만 적용 하기는 쉽습니다. 다음과 같은 perl 스크립트를 $ PATH의 디렉토리에 git-wsf (git whitespace fix)라는 파일에 넣었습니다.

git wsf | 쉬

그리고 dipt로보고 하는 파일 행 에서만 모든 공백을 제거합니다 .

#! /bin/sh
git diff --check | perl -x $0
exit

#! /usr/bin/perl

use strict;

my %stuff;
while (<>) {
    if (/trailing whitespace./) {
        my ($file,$line) = split(/:/);
        push @{$stuff{$file}},$line;
    }
}

while (my ($file, $line) = each %stuff) {
    printf "ex %s <<EOT\n", $file;
    for (@$line) {
        printf '%ds/ *$//'."\n", $_;
    }
    print "wq\nEOT\n";
}

0

약간 늦었지만 이것이 누군가를 도울 수 있기 때문에 여기에 간다.

VIM에서 파일을 엽니 다. 탭을 공백으로 바꾸려면 vim 명령 줄에 다음을 입력하십시오.

:%s#\t#    #gc

다른 후행 공백을 제거하려면

:%s#\s##gc

이것은 거의 나를 위해 그것을했습니다. 편집 할 파일이 많으면 지루합니다. 그러나 사전 커밋 후크와 여러 편집기로 작업하는 것보다 쉽다는 것을 알았습니다.


지루해지고 편집하려는 내용의 백업이있는 경우 종종 sed를 사용하여 탭을 공백으로 바꿉니다 sed -i 's|\t| |g' filenames(바꾸기 위치의 공백). find를 사용하여 파일 이름을 얻을 수 있습니다. 백업을 얻는 방법을 생각하지 못했다면, 나는 보통 모든 것을 커밋 한 다음 소프트 리셋으로 커밋을 '실행 취소'하여 원래 위치로 되돌립니다. 때로는 트리에 모든 것을 추가하지만 커밋하지 않고 때로는 숨김 / 적용 (팝이 아님)을 사용합니다. 불안한 느낌이 든다면, 방해하기 전에 전체 나무를 안전한 위치로 재 동기화합니다.
sage

0

파일에서 줄 끝에서 후행 공백을 삭제하려면 ed다음을 사용하십시오 .

test -s file &&
   printf '%s\n' H ',g/[[:space:]]*$/s///' 'wq' | ed -s file

-1

이것은 문제를 직접 해결하지는 못하지만 실제 프로젝트 공간에서 git-config를 통해 설정하고 싶을 수도 있습니다. ~ / .gitconfig와 달리 ./.git/config를 편집하십시오. 모든 프로젝트 멤버간에 설정을 일관성있게 유지하는 것이 좋습니다.

git config core.whitespace "trailing-space,space-before-tab"
git config apply.whitespace "trailing-space,space-before-tab"

3
afaik, .git 내부의 설정은 다른 사람과 공유 되지 않습니다 . 그들은 당신의 지역
리포지토리에 따라 다릅니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.