Programming

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

procodes 2020. 8. 28. 08:14
반응형

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


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


나는 항상 이것을 Google에 가져야하지만 완벽하게 작동하는 방식은 다음과 같습니다.

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

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


짧은 대답은 patch -p1 -i {patch.file}입니다.

자세한 내용은이 블로그를 참조하십시오 : git로 Subversion 패치 만들기 .


다음은 최신 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.*/===================================================================/"

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

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

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


실제로 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에 도입되었습니다 (하지만 테스트하지는 않았습니다).


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

git show --pretty >> myChangesFile.patch


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의 차이로 생성됩니다.

참고 URL : https://stackoverflow.com/questions/708202/git-format-patch-to-be-svn-compatible

반응형