svn과 호환되는 Git 형식 패치?


96

svn repo에 제출할 수 있도록 git format-patch로 만든 패치를 svn과 호환되도록하는 방법이 있습니까?

github에서 svn 리포지토리에서 작업 중이며 변경 사항을 주 리포지토리에 다시 제출하고 싶습니다. 이 작업을 수행하려면 패치를 만들어야하지만 git 형식이 svn과 다르게 패치되기 때문에 패치를 적용 할 수 없습니다. 아직 발견하지 못한 비밀이 있습니까?

업데이트 : 현재는이를 수행하는 스크립트 또는 네이티브 git 방식이 없지만 올해 초 수동으로 수행하는 방법에 대한 게시물을 찾을 수있었습니다. 나는 지침을 따랐고 svn과 함께 작동하도록 git 패치를 얻는 데 성공했습니다.

누군가가 이것을 달성하고 git 프로젝트에 기여하기 위해 스크립트를 작성하는 데 찔러 넣을 수 있다면 모두에게 감사 할 것입니다.

http://kerneltrap.org/mailarchive/git/2008/1/15/570308/thread#mid-570308


작동하지 않습니다. 필요한 모든 단계를 게시 할 수 있습니까? 감사!
Mauricio Scheffer

1
안녕 Anthony. Nicholas 's에 대한 허용 된 답변을 변경 하시겠습니까?
Simon East

나는 사이먼의 제안을 두 번째로 받아 들였다. 니콜라스 스미스의 대답이 훨씬 더 실용적이기 때문에 모두에게 도움이 될 것이다.
Albireo 2014

답변:


90

나는 항상 이것을 구글에해야하지만 완벽하게 작동하는 방법은 다음과 같습니다.

  • 을 사용하여 패치를 만듭니다. git diff --no-prefix master..branch > somefile.diff마스터 및 분기 부분은 선택 사항이며 diff를 얻는 방법에 따라 다릅니다.
  • 어디로 든 보내고 patch -p0 < somefile.diff.

그것은 항상 나에게 잘 작동하는 것 같고 내가 본 것 중 가장 간단한 방법 인 것 같습니다.


1
이것은 Git으로 SVN 호환 패치를 생성하는 표준 방법입니다. 답변으로 표시되어야합니다.
mloskot 2014

--no-pager은 더 이상의 옵션이 아닙니다 git diff.
naught101

원래는없이 게시되었지만 --no-pager편집에 추가 된 이유가 확실하지 않습니다. --no-pager어쨌든 나에게는 항상 잘 작동했습니다 .
Nicholas Smith

2
: 특정 경우에만 커밋 git diff --no-prefix 056a1ba5140 7d939289b80 >my.patch나를 위해 일한 (여기서 056a1ba51407d939289b80샤-1 이전의 그리고 특히이 자식 커밋).
Ed Randall

@ Lilás 이것은 SVN의 문제입니다. SVN의
차이점


17

다음은 최신 svn 변경 세트 및 주어진 커밋과 비교하기위한 도우미 스크립트입니다. http://www.mail-archive.com/dev@trafficserver.apache.org/msg00864.html

#!/bin/sh
#
# git-svn-diff
# Generate an SVN-compatible diff against the tip of the tracking branch
TRACKING_BRANCH=`git config --get svn-remote.svn.fetch | sed -e 's/.*:refs\/remotes\///'`
REV=`git svn find-rev $(git rev-list --date-order --max-count=1 $TRACKING_BRANCH)`
git diff --no-prefix $(git rev-list --date-order --max-count=1 $TRACKING_BRANCH) $* |
sed -e "s/^+++ .*/&    (working copy)/" -e "s/^--- .*/&    (revision $REV)/" \
-e "s/^diff --git [^[:space:]]*/Index:/" \
-e "s/^index.*/===================================================================/"

1
최신 svn 개정으로 작업하지 않으면 REV 값이 올바르지 않음을 발견했습니다. git svn info대신 다음과 같이 사용하도록 수정했습니다 . REV=`git svn info | grep 'Last Changed Rev:' | sed -E 's/^.*: ([[:digit:]]*)/\1/'`
Sebastien Martin

1
이것은 굉장합니다! 정말 고맙습니다. 나는 어안의 도가니에 내 패치를 가져 오기위한 작업에 대해 하나 명의 변경을했고, 대신 탭 "(개정"을하기 전에 공백을 대체 할였습니다.
Zugwalt

10

SVN은 아마도의 출력을 이해할 수 없지만 git diff -p무차별 대입에 의지 할 수 있습니다.

  1. 저장소의 두 개의 복제본을 만드십시오.
  2. 하나의 클론에서 최신 항목 확인
  3. 다른 클론 체크 아웃에서 svn 업스트림에 해당하는 것이 무엇이든간에. 미리 계획 한 경우 자체 브랜치에 svn upstream 복사본이 있거나 마지막 svn 버전에 태그를 지정했습니다. 미리 계획하지 않은 경우 날짜 또는 gitk를 사용하여 svn 상태에 가장 근접한 git SHA1 해시를 찾으십시오.
  4. 이제 diff -r두 개의 클론 을 실행하여 실제 패치를 계산합니다 .

12
또는 @ Nicholas-smith의 조언을 따르고 git diff --no-prefix > somefile.diffgit repo에서 실행 하고 svn 사용자에게 보내서 patch -p0 < somefile.diff프로젝트의 루트에 패치를 적용하십시오 .
DavidG

10

Subversion <1.6은 패치를 지원하지 않습니다. Subversion 1.7은 패치 적용을 허용하고 통합 diff에 대한 git / hg 확장은 TODO 목록에 있습니다.


4

실제로 기능 요청입니다. 2008 년 초

Linus Torvalds는 당시 다음과 같이 말했습니다.

그래서 나는 당신이 "git diff를하지 마라"라고 말하는 더 강한 무언가가 필요하다고 주장하고, 그것은 또한 최소한 이름 바꾸기 탐지를 허용하지 않아야한다.
솔직히 말해서 현재의 git 패치 (예 : TortoiseSVN)를 받아들이지 않을 정도로 어리석은 프로그램이라면 가장 사소한 부분 만 비활성화해서는 안됩니다. 우리는 우리가 사용하지 않는 것이 확인해야 어떤 오히려 중요한 확장을 :
그들을 무시하는 것은 그것은 diff를 잘못-이해하고 있음을 의미하는 경우 ToirtoiseSVN가, 그들을 무시 할 경우에도, 그것은 전혀 허용하지 않아야합니다.

그래서

 git-format-patch: add --no-binary to omit binary changes in the patch.

2008 년 5 월 / 7 월에 Git1.5.6에 도입되었습니다 (하지만 테스트하지는 않았습니다).


0

git bash 실행에서 변경 사항이 커밋되고 로컬 git 브랜치 위에 기반하는지 확인합니다.

git show --pretty >> myChangesFile.patch


0

Nicholas가 제공하는 대답은 a) 바이너리 파일이 diff에 있거나 b) Windows Git에서 작업하고 공백이있는 디렉토리가있는 경우를 제외하고는 잘 작동합니다. 이 문제를 해결하기 위해 중첩 된 git diff 명령을 추가하여 바이너리를 무시하고 sed 명령을 추가하여 공백을 탈출해야했습니다. 작성하는 것이 약간 번거롭기 때문에 별칭을 만들었습니다.

[alias]
svnpatch = "!f() { git diff --name-only --no-prefix master...$1 | grep -Ev \"\\.sdf|\\.Doc|\\.dll|\\.zip|\\.exe\" | sed 's_\\s_\\\\\\\\ _g'  | xargs git diff --no-prefix master...$1 > $1.patch; echo "Created $1.patch"; }; f"

그런 다음 입력하면 :

git svnpatch Feature123

... 패치 파일 Feature123.patch가 브랜치 마스터의 병합베이스와 브랜치 Feature123의 차이점으로 생성됩니다.

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