Programing

공백이 아닌 변경 사항 만 추가

lottogame 2020. 3. 6. 08:16
반응형

공백이 아닌 변경 사항 만 추가


파일을 저장할 때 후행 공백을 자동으로 잘라내는 텍스트 편집기가 있으며 후행 공백에 심각한 문제가있는 오픈 소스 프로젝트에 기여하고 있습니다.

패치를 제출할 때마다 먼저 관련 공백 만 선택하여 관련 정보 만 선택해야합니다. 그것뿐만 아니라, 내가 달릴 때 git rebase나는 보통 몇 가지 문제 때문에 겪습니다.

따라서 필자는 git add -p모든 변경 사항을 직접 선택하지 않고도 공백이 아닌 변경 사항 만 색인에 추가 할 수 있기를 원합니다 .

누구든지 이것을하는 방법을 알고 있습니까?

편집 : 나는 프로젝트가 작동하는 방식을 바꿀 수 없으며 , 메일 링리스트에서 토론 한 후에 이것을 무시하기로 결정했습니다.


@Frew 솔루션은 내가 필요한 것이 아니기 때문에 정확히 같은 문제에 대해 만든 별칭입니다.

alias.addnw=!sh -c 'git diff -U0 -w --no-color "$@" | git apply --cached --ignore-whitespace --unidiff-zero -'

또는 간단하게 실행할 수 있습니다.

git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero -

최신 정보

이 의견 에 따라 옵션 -U0--unidiff-zero대안 컨텍스트 일치 문제를 각각 추가했습니다 .

기본적으로 add공백을 변경하지 않고 적용 할 패치를 적용합니다 . 당신은이 후 것을 볼 git addnw your/file아직 unstaged 변화가있을 것입니다, 그것은 왼쪽 공백을합니다.

--no-color는 필요하지 않지만 항상 색상이 설정되어 있으므로 사용해야합니다. 어쨌든 미안보다 안전합니다.


이것은 나를 위해 작동합니다 :

숨기고 싶다면이 방법이 효과적입니다.

git stash && git stash apply && git diff -w > foo.patch && git checkout . && git apply foo.patch && rm foo.patch

나는하지 숨겨 놨다 좋아한다, 그러나 나는 자식 + Cygwin에서 내가 그렇게 물건을 내가 다음을 설정 적어도 reflog에 갔다 있는지 확인, 변경 내용이 손실 곳에서 버그로 실행 :

git add . && git commit -am 'tmp' && git reset HEAD^ && git diff -w > foo.patch && git checkout . && git apply foo.patch && rm foo.patch

기본적으로 공간 변경이 포함되지 않은 diff를 만들고 모든 변경 사항을 되 돌린 다음 diff를 적용합니다.


실제 변경 사항 만 포함 된 패치 파일 (공백 변경 만있는 행 제외)을 만든 다음 작업 영역을 정리하고 해당 패치 파일을 적용하십시오.

git diff> 백업
git diff -w> 변경
git reset --hard
patch <변경

나머지 차이, 다음 검토 addcommit정상 등을.

Mercurial과 동등한 기능은 다음과 같습니다.

hg diff> 백업
hg diff -w> 변경
hg 되돌리기-모든
hg 가져 오기-커밋 변경 없음


에 다음을 추가하십시오 .gitconfig.

anw = !git diff -U0 -w --no-color -- \"$@\" | git apply --cached --ignore-whitespace --unidiff-zero "#"

영감 주신 @Colin Herbert의 답변감사드립니다 .

구문 설명

final #은 따옴표 안에 주석으로 처리되지 .gitconfig않지만 대신 셸 내부에 주석으로 처리되어 주석으로 처리되어야합니다. 마침표 git applygit자동으로 배치 되는 사용자 제공 인수 의 끝 과 사용자 제공 인수 사이에 삽입 됩니다 명령 행의 끝. 이러한 주장은 여기서 원하지 않습니다 – 우리는 git apply그것들을 사용하고 싶지 않기 때문에 앞의 주석 문자입니다. 이 명령을 GIT_TRACE=1 git anw실제로 실행하려면이 명령을 실행 하십시오.

--신호는 인수의 종료 및 명명 된 파일이있는 경우에 허용 -w거나 스위치처럼 보이는 무언가를 git diff.

$@사용자 제공 인용 인수를 유지하려면 이스케이프 된 큰 따옴표 가 필요합니다. 경우 "문자가 탈출하지 않습니다, 그것은에 의해 소비 될 것이다 .gitconfig파서와 쉘에 도달하지.

참고 : .gitconfig별칭 구문 분석 아무것도 특별 같은 작은 따옴표를 인식하지 못합니다 - 유일한 특수 문자는 ", \, \n, 및 ;(A 외부 "-quoted 문자열). 이것이 "작은 따옴표로 묶인 문자열 안에있는 것처럼 보이더라도 항상 탈출 해야하는 이유입니다 (git은 완전히 무의식적입니다).

예를 들어 이것은 중요합니다. bash작업 트리의 루트에서 명령 을 실행하기에 편리한 별칭이있는 경우 잘못된 공식은 다음과 같습니다.

sh = !bash -c '"$@"' -

올바른 것은 다음과 같습니다.

sh = !bash -c '\"$@\"' -

댓글의 사용자에 따라 패치 컨텍스트의 공백으로 인해 최상위 투표 답변이 모든 경우에 작동하지 않습니다.

다음과 같이 명령을 수정했습니다.

$ git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero

컨텍스트가없는 패치를 생성합니다. 패치의 수명이 짧기 때문에 문제가되지 않습니다.

해당 별칭, 다시 다른 사용자가 제공 한 내용의 개정판 :

addw = !sh -c 'git diff -U0 -w --no-color "$@" | git apply --cached --ignore-whitespace --unidiff-zero' -

다음은 어떻습니까 :

git add `git diff -w --ignore-submodules |grep "^[+][+][+]" |cut -c7-`

역 따옴표 안의 명령은 공백이 아닌 파일 이름을 가져옵니다.


후행 공백이 의도적인지 먼저 고려해야합니다. Linux 커널, Mozilla, Drupal 및 Kerberos를 포함한 많은 프로젝트 (스타일에 대한 Wikipedia 페이지에서 몇 가지 이름을 지정)는 후행 공백을 금지합니다. 리눅스 커널 문서에서 :

적절한 편집기를 사용하고 줄 끝에 공백을 두지 마십시오.

귀하의 경우 문제는 다른 방법입니다. 이전 커밋 (및 현재 커밋) 은이 지침을 따르지 않았습니다.

나는 아무도 후행 공백을 원하지 않으며, 문제를 해결하는 것이 환영받을만한 변화라고 생각합니다. 다른 사용자도 같은 문제가 발생할 수 있습니다. 후행 공백을 추가하는 기고자들이 그렇게하고 있다는 것을 인식하지 못할 수도 있습니다.

문제를 무시하도록 git을 재구성하거나 편집기에서 다른 바람직한 기능을 비활성화하는 대신 문제를 설명하는 프로젝트 메일 링리스트에 게시하는 것으로 시작하겠습니다. 많은 편집기 (및 git 자체)는 후행 공백을 처리하도록 구성 할 수 있습니다.


후행 공백을 제거 하는 자식 사전 커밋 후크를 찾았습니다 . 그러나 다른 사람이 이것을 사용할 수 없다면 유효한 해결책이 아닐 수 있습니다.

  #!/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"
  done
  exit

참고 URL : https://stackoverflow.com/questions/3515597/add-only-non-whitespace-changes



반응형