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
무차별 대입에 의지 할 수 있습니다.
- 저장소의 두 개의 복제본을 만드십시오.
- 하나의 클론에서 최신 항목 확인
- 다른 클론 체크 아웃에서 svn 업스트림과 동일한 것이 무엇이든간에. 미리 계획 한 경우 자체 브랜치에 svn upstream 복사본이 있거나 마지막 svn 버전에 태그를 지정했습니다. 미리 계획하지 않은 경우 날짜 또는 gitk를 사용하여 svn 상태에 가장 근접한 git SHA1 해시를 찾으십시오.
- 이제
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
'Programming' 카테고리의 다른 글
블록 기반 API 메서드에서 null이 아닌 nullable Objective-C 키워드를 사용하는 방법 (0) | 2020.08.28 |
---|---|
Windows의 Emacs (0) | 2020.08.28 |
우선 순위 및 비트 마스크 작업 (0) | 2020.08.28 |
구조를 비교할 때이 주장이 형식 예외를 던지는 이유는 무엇입니까? (0) | 2020.08.28 |
Maven이 매번 maven-metadata.xml을 다운로드하는 이유는 무엇입니까? (0) | 2020.08.28 |