git은 공백과 탭을 자동으로 전환 할 수 있습니까?


196

파이썬 프로그램에서 들여 쓰기에 탭을 사용하지만 대신 공백을 사용하는 사람들과 협력하고 싶습니다 (git 사용).

푸시 / 페치시 git이 공백과 탭 (예 : 4 공백 = 1 탭) 사이를 자동으로 변환하는 방법이 있습니까? (CR / LF 변환과 유사)


33
PEP8은 정확히 내 문제입니다. 모두가 그것을 따르고 탭이 붙어 있습니다. 하나의 들여 쓰기 = 하나의 탭 이 올바른 일 이라고 생각합니다 (왜 공백? 왜 4 공백? PEP8은 그것을 설명하지 않습니다 ...). 어쨌든,이 git trick을 사용하면 컴퓨터의 탭을 행복하게 사용하고 모든 PEP8 팔로워와 코드를 공유 할 수 있습니다.
Olivier Verdier

7
오! TextMate를 사용하고 공백 간을 탭으로 변환 할 수 있습니다. 문제는 탭을 눌렀을 때 편집자가 탭을 쓰는 것을 좋아한다는 것입니다. 공백이있는 파이썬 프로젝트를 체크 아웃하면 모든 종류의 탭을 삽입합니다. 수동으로 탭으로 변환해야하지만 체크인 할 때 1000 개의 삭제, 1000 개의 추가가 표시되며 공동 작업자는 만족하지 않습니다. :-)
Olivier Verdier

6
PEP8이 탭 대신 공백을 지정하는 이유는 연속 들여 쓰기 규칙 때문입니다. 괄호 안에 긴 줄을 계속 두 가지 방법이 있습니다. 괄호 바로 뒤에 새 줄을 시작하면 들여 쓰기 만됩니다. 대신 괄호 내용의 일부를 첫 번째 줄에 넣으면 여는 괄호의 들여 쓰기 수준에서 다음 줄에 괄호를 계속 사용해야합니다. 작동하지 않는 탭을 사용하는 경우
존 크리스토퍼 존스

2
이 상황에서 @JohnChristopherJones, 탭을 사용하여 들여 쓰기를 이전 줄과 일치시킨 다음 공백을 사용하여 이전 줄의 위치를 ​​일치시킬 수 있습니다. 이것은 공백으로 쉽게 변환 될 수 있습니다. 불행히도 그 반대의 경우는 들여 쓰기 정보와 정렬 정보를 혼합하기 때문입니다.
Patrick Parker

답변:


195

완벽한 솔루션은 다음과 같습니다.

저장소에서 .git/info/attributes다음을 포함 하는 파일 을 추가하십시오 .

*.py  filter=tabspace

리눅스 / 유닉스

이제 다음 명령을 실행하십시오 :

git config --global filter.tabspace.smudge 'unexpand --tabs=4 --first-only'
git config --global filter.tabspace.clean 'expand --tabs=4 --initial'

OS X

먼저 brew와 함께 coreutils를 설치하십시오.

brew install coreutils

이제 다음 명령을 실행하십시오 :

git config --global filter.tabspace.smudge 'gunexpand --tabs=4 --first-only'
git config --global filter.tabspace.clean 'gexpand --tabs=4 --initial'

모든 시스템

이제 프로젝트의 모든 파일을 확인할 수 있습니다. 당신은 그것을 할 수 있습니다 :

git checkout HEAD -- **

모든 파이썬 파일에는 공백 대신 탭이 있습니다.

편집 : 강제 체크 아웃 명령을 변경했습니다. 물론 일을 먼저해야합니다.


1
깨끗한 필터가 작동하지 않습니다. 내가 git add 할 때. "오류 : 외부 필터 확장 --tabs = 4-초기 실패"라는 오류가 표시됩니다. 저는 Windows에 있습니다. 차이가 있습니까?
Jeremy Hicks

2
@Jeremy : expand / unexpand는 유닉스 명령어입니다. Windows 포트 / 동등 항목을 찾거나 Cygwin
Tim

1
나는 인피부 작업 버전을 발견했습니다 sourceforge.net/projects/gnuwin32/files/coreutils/5.3.0
hazzik에게

3
@ Marc-André 좋은 지적입니다. 실제로 coreutils 버전을 사용합니다. (설치 homebrew후 실행 brew install coreutils)
Olivier Verdier

2
이것은 더 이상 작동하지 않는 것 같습니다. 필터는 나를 위해 아무것도하지 않습니다. 체크 아웃 후에도 파일에는 여전히 공백이 있습니다. 이것에 대한 업데이트?
Philipp Ludwig

141

예, 잠재적 해결책 중 하나는 git 속성 필터 드라이버 ( GitPro book 참조 )를 사용하여 얼룩 / 청소 메커니즘을 정의하는 것입니다.

대체 텍스트

그런 식으로:

  • repo의 일부 파일을 체크 아웃 할 때마다 공백이 탭에서 변환 될 수 있습니다.
  • 그러나 체크인 (및 푸시 및 게시) 할 때 동일한 파일은 공백 만 사용하여 다시 저장됩니다.

Git 저장소 내의 모든 파일에 적용되는 필터에 대해이 필터 드라이버 (여기 이름은 ' tabspace')를 .git/info/attributes다음과 같은 내용으로 선언 할 수 있습니다 .

*.py  filter=tabspace

이제 다음 명령을 실행하십시오 :

# local config for the current repo
git config filter.tabspace.smudge 'script_to_make_tabs'
git config filter.tabspace.clean 'script_to_make_spaces'

이러한 얼룩 / 깨끗한 지침 세트의 구체적인 작업 예는 Olivier답변 을 참조하십시오 .


불행히도, 그것은 작동하지 않습니다. 나는 모든 지침을 따랐지만 git은 fiter를 적용하지 않습니다. :-( 체크 아웃 할 때 얼룩 필터가 적용되지 않고 체크인 할 때 아무 것도 발생하지 않습니다 ... 자식이 너무 실망하는 경우가 있습니다 ...
Olivier Verdier

@Olivier : 이상하게도, 체크 아웃 / 체크 속도를 늦추지 않기 위해 속성 필터의 범위를 특정 하위 트리, 특정 유형의 파일에 대해서만 신중하게 제한하는 한 아무런 문제가 없었습니다. 과정에서. 예를 들어 stackoverflow.com/questions/62264/…
VonC

감사! 이제 작동합니다. 전체 솔루션보기 : stackoverflow.com/questions/2316677/…
올리비에 베르디 르

@Vonc : 아마도 --global모든 협업 프로젝트에 공간을 보낼 것이므로 플래그를 제거해야합니다 .
Willem Van Onsem

@CommuSoft는 권리가있는 프로젝트에만 해당됩니다 .gitattributes. 그러나 예, 구성이 리포지토리에 로컬로 유지되는지 이해하는 것이 더 쉽습니다. 답변을 편집했습니다.
VonC

39

GitHub (또는 기타 유사한 서비스)를 사용하는 모든 사람에게 매우 유용한 정보

~/.gitconfig

[filter "tabspace"]
    smudge = unexpand --tabs=4 --first-only
    clean = expand --tabs=4 --initial
[filter "tabspace2"]
    smudge = unexpand --tabs=2 --first-only
    clean = expand --tabs=2 --initial

그런 다음 두 개의 파일이 있습니다. attributes

*.js  filter=tabspace
*.html  filter=tabspace
*.css  filter=tabspace
*.json  filter=tabspace

attributes2

*.js  filter=tabspace2
*.html  filter=tabspace2
*.css  filter=tabspace2
*.json  filter=tabspace2

개인 프로젝트 작업

mkdir project
cd project
git init
cp ~/path/to/attributes .git/info/

그렇게하면 마침내 github에서 작업을 푸시 할 때 8 space tabs모든 브라우저에서 기본 동작 인 코드보기에서 바보처럼 보이지 않습니다 .

다른 프로젝트에 기여

mkdir project
cd project
git init
cp ~/path/to/attributes2 .git/info/attributes
git remote add origin git@github.com:some/repo.git
git pull origin branch

이렇게하면 2 space indented프로젝트 에서 일반 탭으로 작업 할 수 있습니다.

물론 4 space to 2 space내가 게시 한 프로젝트에 기여하고 개발하는 동안 2 개의 공백을 사용하는 경향이있는 경우 유사한 변환 솔루션을 작성할 수 있습니다 .



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.