Git format-patch เข้ากันได้กับ svn หรือไม่?


98

มีวิธีใดบ้างที่จะทำให้แพตช์ที่สร้างด้วย git format-patch เข้ากันได้กับ svn เพื่อให้ฉันสามารถส่งไปยัง svn repo ได้

ฉันกำลังแก้ไข svn repo บน github และต้องการส่งการเปลี่ยนแปลงของฉันกลับไปที่ repo หลัก ฉันต้องสร้างแพตช์เพื่อทำสิ่งนี้ แต่ไม่สามารถใช้แพตช์ได้เนื่องจากรูปแบบ git ที่แพตช์แตกต่างจาก svn มีความลับบางอย่างที่ฉันยังไม่ค้นพบหรือไม่?

อัปเดต:แม้ว่าในปัจจุบันจะไม่มีสคริปต์หรือวิธี git ดั้งเดิมในการทำสิ่งนี้ แต่ฉันก็หาโพสต์จากต้นปีนี้เกี่ยวกับวิธีการทำสิ่งนี้ด้วยตนเอง ฉันทำตามคำแนะนำและประสบความสำเร็จในการรับแพตช์คอมไพล์เพื่อทำงานกับ svn

หากมีใครสักคนสามารถเขียนสคริปต์เพื่อทำสิ่งนี้ให้สำเร็จและมีส่วนร่วมในโครงการ git ฉันทุกคนจะได้รับการชื่นชมมาก

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


ฉันไม่สามารถทำงานได้ ... คุณโพสต์ขั้นตอนทั้งหมดที่จำเป็นได้ไหม ขอบคุณ!
Mauricio Scheffer

1
สวัสดี Anthony คุณจะพิจารณาเปลี่ยนคำตอบที่ยอมรับของนิโคลัสหรือไม่?
Simon East

ฉันเป็นข้อเสนอแนะที่สองของ Simon การมีคำตอบของ Nicholas Smith ในฐานะที่เป็นที่ยอมรับจะเป็นประโยชน์ต่อทุกคนเนื่องจากเป็นประโยชน์มากกว่า
Albireo

คำตอบ:


93

ฉันต้องใช้ Google เสมอ แต่วิธีที่ฉันพบว่าทำงานได้ดี (สำหรับฉัน) คือ:

  • สร้างแพตช์โดยgit diff --no-prefix master..branch > somefile.diffใช้ส่วนหลักและส่วนสาขาเป็นทางเลือกขึ้นอยู่กับว่าคุณต้องการได้รับความแตกต่างอย่างไร
  • ส่งได้ทุกที่และสมัครด้วยpatch -p0 < somefile.diff.

ดูเหมือนว่าจะใช้ได้ดีสำหรับฉันเสมอและดูเหมือนจะเป็นวิธีที่ง่ายที่สุดที่ฉันเคยเจอ


1
นี่เป็นวิธีที่ยอมรับได้ในการสร้างโปรแกรมแก้ไขที่เข้ากันได้กับ SVN ด้วย Git ควรทำเครื่องหมายว่าเป็นคำตอบ
mloskot

--no-pagergit diffไม่มีตัวเลือกสำหรับ
naught101

เดิมโพสต์โดยไม่มี--no-pagerฉันไม่แน่ใจว่าเหตุใดจึงถูกเพิ่มในการแก้ไข มันใช้งานได้ดีสำหรับฉัน--no-pagerเสมอ
Nicholas Smith

3
สำหรับการกระทำเฉพาะเท่านั้น: ใช้ได้git diff --no-prefix 056a1ba5140 7d939289b80 >my.patchกับฉัน (โดยที่056a1ba5140และ7d939289b80เป็น sha-1 ของคอมมิตก่อนหน้าและเฉพาะในคอมไพล์)
Ed Randall

@ Lilásนี่เป็นปัญหากับ SVN ความแตกต่าง / แพตช์ใน SVN ไม่เคยสามารถจัดการไฟล์ที่ถูกลบ
Toofy

21

patch -p1 -i {patch.file}คำตอบสั้น ๆ

โปรดดูที่บล็อกนี้สำหรับรายละเอียด: การสร้างการโค่นล้มแพทช์กับคอมไพล์


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
ฉันพบว่าค่า REV ไม่ถูกต้องหากคุณไม่ได้ทำงานกับการแก้ไข svn ล่าสุด ฉันแก้ไขให้ใช้git svn infoแทนดังนี้ REV=`git svn info | grep 'Last Changed Rev:' | sed -E 's/^.*: ([[:digit:]]*)/\1/'`
Sebastien Martin

1
นี่มันเจ๋งมาก! ขอบคุณมาก. ฉันต้องทำการเปลี่ยนแปลงหนึ่งครั้งเพื่อให้สามารถนำเข้าแพตช์ของฉันไปยังเบ้าหลอมของ Fisheye ได้และนั่นคือการแทนที่ช่องว่างก่อน "(การแก้ไข" ด้วยแท็บแทน
Zugwalt

10

SVN อาจไม่เข้าใจผลลัพธ์ของgit diff -pแต่คุณสามารถใช้กำลังดุร้าย:

  1. สร้าง repo ของคุณสองโคลน
  2. ในหนึ่งโคลนตรวจสอบสิ่งล่าสุดของคุณ
  3. ในการชำระเงินโคลนอื่น ๆ สิ่งที่เทียบเท่ากับ svn upstream หากคุณวางแผนล่วงหน้าคุณมีสำเนาของ svn upstream ในสาขาของตัวเองหรือคุณได้ติดแท็กเวอร์ชัน svn ล่าสุด หากคุณไม่ได้วางแผนล่วงหน้าให้ใช้วันที่หรือ gitk เพื่อค้นหาแฮช Git SHA1 ที่ใกล้เคียงกับสถานะ svn มากที่สุด
  4. ตอนนี้คำนวณแพตช์จริงโดยการรันdiff -rบนสองโคลน

12
หรือเพียงทำตามคำแนะนำของ @Nicholas-smith และเรียกใช้git diff --no-prefix > somefile.diffใน git repo ของคุณและส่งไปยังผู้ใช้ svn เพื่อให้พวกเขาใช้โปรแกรมแก้ไขpatch -p0 < somefile.diffในรูทของโปรเจ็กต์
DavidG

10

การโค่นล้ม <1.6 ไม่มีการสนับสนุนแพตช์ ดูเหมือนว่า Subversion 1.7 จะอนุญาตให้ใช้แพตช์และส่วนขยาย git / hg กับ unified diff อยู่ในรายการสิ่งที่ต้องทำของเรา


4

มันเป็นการร้องขอคุณสมบัติช่วงต้นปี 2008

Linus Torvalds กล่าวในเวลานั้น:

ดังนั้นฉันจะเถียงว่าคุณต้องมีอะไรที่แข็งแรงกว่านี้เพื่อที่จะพูดว่า "อย่าทำ git diff" และนั่นก็ควรจะไม่อนุญาตให้เปลี่ยนชื่อการตรวจจับอย่างน้อยที่สุด
ค่อนข้างตรงไปตรงมาโปรแกรมใด ๆ ที่โง่มากจนไม่ยอมรับแพตช์คอมไพล์ปัจจุบัน (เช่น TortoiseSVN) ดังนั้นเราก็ไม่ควรปิดการใช้งานส่วนที่ไม่สำคัญที่สุดของมัน เราควรตรวจสอบให้แน่ใจว่าเราไม่ได้เปิดใช้งานใด ๆของนามสกุลที่สำคัญค่อนข้าง:
แม้ว่า ToirtoiseSVN จะไม่สนใจพวกเขาถ้าไม่สนใจพวกเขาหมายความว่าผิดพลาดเข้าใจมันต่างก็ไม่ควรได้รับอนุญาตที่ทั้งหมด

นั่นอาจเป็นเหตุผลว่าทำไม

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

ได้รับการแนะนำใน Git1.5.6 ในเดือนพฤษภาคม / กรกฎาคม 2008 (ฉันยังไม่ได้ทดสอบ)


0

ตรวจสอบให้แน่ใจว่าการเปลี่ยนแปลงของคุณได้รับการยอมรับและได้รับการตั้งค่าใหม่ที่ด้านบนของสาขา git ในพื้นที่ของคุณจาก git bash run:

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 จะถูกสร้างขึ้นโดยมีความแตกต่างระหว่างฐานการผสานของ Branch Master และ Branch Feature123

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.