Git प्रारूप-पैच svn संगत हो?


96

क्या कोई प्रारूप git फॉर्मेट-पैच के साथ svn संगत होने के लिए बनाया गया है ताकि मैं इसे svn repo में जमा कर सकूं?

मैं गितुब पर एक svn रेपो से काम कर रहा हूं और अपने परिवर्तनों को मुख्य रेपो में वापस सबमिट करना चाहता हूं। मुझे यह करने के लिए एक पैच बनाने की आवश्यकता है, हालांकि पैच को git प्रारूपों के बाद से लागू नहीं किया जा सकता है जो अलग-अलग पैच तो svn। क्या कुछ रहस्य है जो मैंने अभी तक नहीं खोजा है?

अद्यतन: हालांकि वर्तमान में ऐसा करने के लिए कोई स्क्रिप्ट या देशी तरीका मौजूद नहीं है, लेकिन मैंने इसे मैन्युअल रूप से कैसे पूरा किया जाए, इस बारे में इस साल के शुरू से एक पोस्ट खोजने में कामयाब रहा। मैंने निर्देशों का पालन किया है और svn के साथ काम करने के लिए मेरे गिट पैच पाने में सफलता मिली है।

अगर कोई इसे पूरा करने के लिए पटकथा लिखने और git प्रोजेक्ट में योगदान करने के लिए एक स्टैब ले सकता है, तो मैं हर किसी की बहुत सराहना करूंगा।

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


मुझे यह काम करने के लिए नहीं मिल सकता है ... क्या आप आवश्यक सभी चरणों को पोस्ट कर सकते हैं? धन्यवाद!
मौरिसियो शेफ़र

1
हाय एंथोनी। क्या आप निकोलस के स्वीकृत उत्तर को बदलने पर विचार करेंगे?
साइमन ईस्ट

मैं साइमन का दूसरा सुझाव है, निकोलस स्मिथ के जवाब के रूप में स्वीकार किए जाने के बाद सभी को लाभ होगा क्योंकि यह बहुत अधिक व्यावहारिक है।
एल्बेरियो

जवाबों:


90

मुझे हमेशा यह गूगल करना है लेकिन जिस तरह से मैंने पाया है कि यह पूरी तरह से काम करता है (मेरे लिए) है:

  • साथ पैच बनाएँ git diff --no-prefix master..branch > somefile.diff, मास्टर और शाखा भाग वैकल्पिक हैं, यह निर्भर करता है कि आप अपने अंतर को कैसे प्राप्त करना चाहते हैं।
  • इसे जहां भी भेजें और साथ में आवेदन करें patch -p0 < somefile.diff

यह हमेशा मेरे लिए ठीक काम करने लगता है और मुझे लगता है कि सबसे आसान तरीका है।


1
यह गिट के साथ एसवीएन-संगत पैच उत्पन्न करने के लिए विहित तरीका है। इसे उत्तर के रूप में चिह्नित किया जाना चाहिए।
mloskot

--no-pagerअब कोई विकल्प नहीं है git diff
naught101

यह मूल रूप से बिना पोस्ट किया गया था --no-pager, मुझे यकीन नहीं है कि इसे एडिट में क्यों जोड़ा गया था। यह हमेशा मेरे लिए --no-pagerवैसे भी बिना ठीक काम किया है ।
निकोलस स्मिथ

2
एक विशेष के लिए ही प्रतिबद्ध: git diff --no-prefix 056a1ba5140 7d939289b80 >my.patchमेरे लिए काम किया (जहां 056a1ba5140और 7d939289b80SHA-1 पिछले के हैं और विशेष रूप से Git में प्रतिबद्ध)।
एड रैंडल

@ लीलस यह एसवीएन के साथ एक समस्या है। SVN में मुश्किल / पैच कभी भी हटाए गए फ़ाइलों को संभालने में सक्षम नहीं हुए हैं
टॉफी


17

यहाँ नवीनतम svn changeet और दिए गए प्रतिबद्ध के खिलाफ एक अलग बनाने के लिए एक सहायक स्क्रिप्ट है: 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/'`
सेबस्टियन मार्टिन

1
यह कमाल का है! बहुत बहुत धन्यवाद। मुझे इसके लिए एक बदलाव करना था ताकि फ़िशे के क्रूसिबल में मेरे पैच को आयात करने के लिए काम कर सकूं, और यह था कि रिक्त स्थान को "पुनरीक्षण" से पहले एक टैब के साथ बदल दिया जाए।
जुगवाल्ट

10

एसवीएन शायद इसके उत्पादन को नहीं समझ सकता है git diff -p, लेकिन आप बल का सहारा ले सकते हैं:

  1. अपने रेपो के दो क्लोन बनाएं
  2. एक क्लोन में अपने नवीनतम सामान की जाँच करें
  3. अन्य क्लोन चेकआउट में जो कुछ भी svn अपस्ट्रीम के बराबर है। यदि आपने आगे की योजना बनाई है तो आपके पास अपनी शाखा पर svn अपस्ट्रीम की एक प्रति है, या आपने पिछले svn संस्करण को टैग किया है। यदि आपने आगे की योजना नहीं बनाई है, तो git SHA1 हैश को खोजने के लिए तिथि या gitk का उपयोग करें जो कि सबसे अधिक svj स्थिति का अनुमान लगाता है।
  4. अब diff -rदो क्लोनों पर चलाकर एक वास्तविक पैच की गणना करें ।

12
या बस @ निकोलस-स्मिथ की सलाह का पालन करें और git diff --no-prefix > somefile.diffअपने गिट रेपो में चलाएं और उन्हें किसी भी svn उपयोगकर्ता patch -p0 < somefile.diffको प्रोजेक्ट की जड़ में पैच लगाने के लिए भेजें ।
डेविड

10

तोड़फोड़ <1.6 पैच समर्थन नहीं है। ऐसा लगता है कि तोड़फोड़ 1.7 पैच लगाने की अनुमति देगा और एकीकृत रूप से गिट / एचजी एक्सटेंशन हमारी TODO सूची में हैं।


4

यह वास्तव में 2008 की शुरुआत में एक फीचर अनुरोध है

लिनस टोरवाल्ड्स ने उस समय कहा:

इसलिए मेरा तर्क है कि आपको "एक अंतर नहीं करना" कहने के लिए कुछ मजबूत करने की आवश्यकता है, और यह भी कि न्यूनतम नाम बदलने का पता लगाना चाहिए।
स्पष्ट रूप से, कोई भी प्रोग्राम जो इतना बेवकूफ है कि वर्तमान गिट पैच (यानी टोर्टोइस वीवीएन) को स्वीकार नहीं करता है, तो हम बहुत अच्छी तरह से इसके सबसे तुच्छ हिस्से को अक्षम नहीं करना चाहिए। हमें यह सुनिश्चित करना चाहिए कि हम किसी भी महत्वपूर्ण एक्सटेंशन को सक्षम नहीं करते हैं :
भले ही ToirtoiseSVN उन्हें अनदेखा कर देगा, अगर उन्हें अनदेखा करने का मतलब है कि यह गलत तरीके से अंतर को समझता है, तो इसे बिल्कुल भी अनुमति नहीं दी जानी चाहिए।

ऐसा क्यों हो सकता है

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

मई / जुलाई 2008 में Git1.5.6 में पेश किया गया है (हालांकि मैंने इसका परीक्षण नहीं किया है)


0

सुनिश्चित करें कि आपके परिवर्तन आपके स्थानीय git शाखा के शीर्ष पर किए गए और छूट दिए गए हैं, git bash run से:

git show --pretty >> myChangesFile.patch


0

निकोलस द्वारा प्रदान किया गया स्वीकृत उत्तर ठीक काम करता है, सिवाय इसके कि जब एक) द्विआधारी फ़ाइलें मौजूद या ख में मौजूद हों) तो आप विंडो गिट में काम कर रहे हैं और रिक्त स्थान के साथ निर्देशिकाएं हैं। उस समाधान को पाने के लिए मुझे बायनेरिज़ को अनदेखा करने के लिए एक नेस्टेड जीआईटी डिफरेंट कमांड जोड़ना पड़ा और स्पेस से बचने के लिए सेड कमांड दिया। यह लिखना थोड़ा कठिन है, इसलिए मैंने एक उपनाम बनाया:

[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 के मर्ज बेस के बीच अंतर के साथ बनाया जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.