programing

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

bestprogram 2023. 5. 27. 12:02

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

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

패치를 제출할 때마다 먼저 관련 정보만 선택하기 위해 수동으로 모든 공백만 변경한 내용을 무시해야 합니다.뿐만 아니라, 내가 달릴 때.git rebase저는 보통 그들 때문에 여러 가지 문제에 부딪힙니다.

때문에 이 아닌 변화만을 할 수 .git add -p하지만 모든 변경 사항을 직접 선택할 필요는 없습니다.

이거 어떻게 하는지 아는 사람?

편집: 프로젝트의 작동 방식을 변경할 수 없으며, 메일링 목록에서 논의한 후 이를 무시하기로 결정했습니다.

@Frew 솔루션은 제가 필요로 하는 솔루션이 아니었습니다. 그래서 바로 이와 같은 문제에 대해 만든 별칭입니다.

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

또는 다음을 간단히 실행할 수 있습니다.

git diff -U0 -w --no-color --src-prefix=a/ --dst-prefix=b/ | git apply --cached --ignore-whitespace --unidiff-zero -

갱신하다

추가됨-U0,그리고.--unidiff-zero 의견에 따라 각각 컨텍스트 일치 문제를 해결합니다.

기본적으로 적용될 패치를 적용합니다.add공백을 변경하지 않습니다.잠시 후에 알게 될 것입니다.git addnw your/file아직 단계적으로 변경되지 않은 부분이 있을 것입니다. 공백이 남아 있습니다.

--no-color는 필요하지 않지만 항상 설정된 색상이기 때문에 사용해야 합니다.어쨌든, 미안한 것보다는 안전한 것이 낫습니다.

경고

하지만, 만약 이 이 하여 빈 줄, 이 은 작 만 트 내 변 을 삭 려 하 는 제 용 경 우 경 줄 빈 사 여 하 용 이 을 지 하 릭 트 릭 그 동 대 로 ▁while ▁works 우 ▁changes ▁line ▁with 경 는 려 ▁blank ▁as ▁it ▁if ▁you ▁to이 하 ▁drop--ignore-blank-lines그러면 일이 복잡해집니다.옵션을 하면, 이옵을사면하용션,,git diff대상 파일의 줄 번호가 꺼져 있기 때문에 일부 청크만 삭제하고 결과 패치는 가짜가 됩니다.

실제 변경 사항만 포함하는 패치 파일(공백으로 변경된 행만 제외)을 만든 다음 작업 공간을 정리하고 해당 패치 파일을 적용합니다.

diff > git diff > 업백
diff > git diff -w > 경변사항사
git reset --hard
< changes > < 항치패사항

나머지 차이점을 검토한 다음add그리고.commit여느 때와 같이

Mercurial에 해당하는 것은 다음과 같습니다.

> > 업백
-w > diff -w > 변경사항사
hg revert --all
hg 가져오기 -- 커밋하지 않은 변경 사항

이것은 나에게 도움이 됩니다.

만약 당신이 주변에 저장하고 싶다면, 이것은 작동합니다.

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

저는 스택을 좋아하지 않지만 변경 사항이 손실되는 버그짓+cygwin에 부딪혔기 때문에 리필로그에 내용이 전달되는지 확인하기 위해 최소한 다음을 설정합니다.

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

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

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

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

$ 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' -

다을추다니에 합니다..gitconfig:

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

영감에 대한 @Colin Herbert의 답변에 감사드립니다.

구문 설명

결승전#인용해야 하므로 내부에서 코멘트로 취급되지 않습니다..gitconfig그러나 대신 통과되고 셸 내부의 주석으로 처리됩니다. - 그것은 끝 사이에 삽입됩니다.git apply 중에서 사용자가 제공한 인수입니다.git명령줄 끝에 자동으로 배치합니다.이러한 주장들은 여기서 원하지 않습니다 - 우리는 원하지 않습니다.git apply앞의 주석 문자를 사용합니다.는 "" " " " " " " " 로 할 수 .GIT_TRACE=1 git anw이것을 실행하는 것을 보기 위해.

--이 " " " " 인 합니다.-w또는 로 전환하는 것처럼 보이는 것.git diff.

주변의 이스케이프 이중 따옴표$@사용자 제공 따옴표로 묶인 인수를 보존하려면 이 필요합니다.에 약에만."이스케이프되지 , 터는탈않고지출하, 은소것입다니비될그것릭에 의해 입니다..gitconfig파서는 껍질에 닿지 않습니다.

참고:.gitconfigparsing은으로 인식하지 - 의 유일한 . 유일한 특수 문자는 다음과 같습니다.",\,\n,그리고.;의 경우)"- 문자열 포함).이것이 이유입니다."단일 스레드 문자열 안에 있는 것처럼 보이더라도 항상 이스케이프해야 합니다(Git는 완전히 독립적입니다).

를 들어 이은중다니를 할 수 한 별칭이 있는 입니다. 예를 들어 실행할 수 있는 유용한 별칭이 있는 경우bash명령을 사용할 수 있습니다.잘못된 공식은 다음과 같습니다.

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

올바른 방법은 다음과 같습니다.

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

다음은 어떻습니까?

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

백쿼트 내부의 명령은 공백이 아닌 변경된 파일의 이름을 가져옵니다.

@void와 유사합니다.포인터의 응답이지만 가장 최근의 커밋을 수정합니다.

git reset --mixed HEAD^
git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero -

이렇게 하면 공백 변경은 준비되지 않고 나머지는 준비됩니다.

제게 도움이 됩니다.

git config apply.whitespace fix

각 커밋 전에 다음 명령을 사용합니다.

git add -up .

이건 제 해킹입니다.

git diff -w | grep "diff --git a/*" | sed -r 's#diff --git a/(.*) b(.*)#\1#g' | xargs git add 

git diff -w는 공백이 아닌 변경 사항이 있는 파일만 표시합니다.

파일을 저장할 때 후행 공백을 자동으로 잘라내는 텍스트 편집기가 있습니다.

당신의 에디터는 proj/dir에 특정한 설정을 가지고 있지 않나요?이 프로젝트에 대한 빈 공간 기본 설정을 사용하지 않을 수 있습니다.훨씬 더 쉬운 해결책인 것 같군요...

후행 공백을 제거하는 깃 사전 커밋 후크를 찾았습니다.그러나 다른 사용자가 이 기능을 사용하도록 할 수 없는 경우에는 유효한 솔루션이 아닐 수 있습니다.

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

먼저 후행 공백이 의도적인지 여부를 고려해야 합니다.Linux 커널, Mozilla, Drupal 및 Kerberos(스타일에 따라 위키백과 페이지의 몇 가지 예를 들어)를 포함한 많은 프로젝트는 공백의 추적을 금지합니다.Linux 커널 설명서에서 다음을 수행합니다.

괜찮은 편집기를 구해서 줄 끝에 공백을 두지 마세요.

당신의 경우 문제는 반대입니다. 이전의 커밋(및 현재의 커밋)이 이 지침을 따르지 않았을 수도 있습니다.

아무도 뒤에 오는 공백을 원하지 않으며 문제를 해결하는 것은 환영할 만한 변화일 수 있습니다.다른 사용자도 사용자와 동일한 문제를 겪고 있을 수 있습니다.또한 후행 공백을 추가하는 기여자는 자신이 그렇게 하고 있다는 것을 알지 못할 수 있습니다.

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

언급URL : https://stackoverflow.com/questions/3515597/add-only-non-whitespace-changes