Git format-patch svn uyumlu olacak mı?


98

Git format-patch ile oluşturulmuş bir yamanın svn uyumlu olması için bir svn deposuna gönderebilmem için herhangi bir yolu var mı?

Github'da bir svn deposu üzerinde çalışıyorum ve değişikliklerimi ana depoya geri göndermek istiyorum. Bunu yapmak için bir yama oluşturmam gerekiyor, ancak git biçimleri svn'den farklı olarak yama uyguladığından yama uygulanamıyor. Henüz keşfetmediğim bir sır var mı?

GÜNCELLEME: Şu anda bunu yapmak için herhangi bir komut dosyası veya yerel git yolu olmamasına rağmen, bu yılın başlarında bunu manuel olarak nasıl yapacağımla ilgili bir gönderi bulmayı başardım. Talimatları takip ettim ve git yamalarımı svn ile çalıştırmayı başardım.

Birisi bunu başarmak ve git projesine katkıda bulunmak için bir senaryo yazmayı deneyebilirse, herkes çok memnun olur.

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


Çalışmasını sağlayamıyorum ... gerekli tüm adımları gönderebilir misin? Teşekkürler!
Mauricio Scheffer

1
Merhaba Anthony. Nicholas'ın kabul ettiği yanıtı değiştirmeyi düşünür müsünüz?
Simon East

Simon'un önerisini ikinci olarak, Nicholas Smith'in cevabının kabul edilmiş olması, çok daha pratik olduğu için herkese fayda sağlayacaktır.
Albireo

Yanıtlar:


94

Bunu her zaman Google'a bildirmek zorundayım, ancak bunun mükemmel bir şekilde çalıştığını bulduğum yol (benim için):

  • Yamayı ile oluşturun, git diff --no-prefix master..branch > somefile.diffana ve dal parçası isteğe bağlıdır, farklarınızı nasıl almak istediğinize bağlıdır.
  • İstediğin yere gönder ve başvur patch -p0 < somefile.diff.

Benim için her zaman iyi çalışıyor gibi görünüyor ve karşılaştığım en basit yöntem gibi görünüyor.


1
Git ile SVN uyumlu yama oluşturmanın kanonik yolu budur. Cevap olarak işaretlenmelidir.
mloskot

--no-pagerartık bir seçenek değil git diff.
naught101

Başlangıçta olmadan yayınlandı --no-pager, düzenlemeye neden eklendiğinden emin değilim. --no-pagerZaten benim için her zaman iyi çalıştı .
Nicholas Smith

3
Yalnızca belirli bir commit için: git diff --no-prefix 056a1ba5140 7d939289b80 >my.patchbenim için çalıştı ( git'te önceki ve özel commit'in sha-1'i nerede 056a1ba5140ve burada 7d939289b80).
Ed Randall

@ Lilás bu SVN ile ilgili bir sorundur. SVN'deki farklılıklar / yamalar hiçbir zaman kaldırılan dosyaları işleyemedi
Toofy


17

İşte en son svn değişiklik kümesine ve verilen kaydetmeye karşı bir fark yaratmak için yardımcı bir komut dosyası: 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
En son svn revizyonuyla çalışmıyorsanız, REV değerinin yanlış olduğunu buldum. Bunun git svn infoyerine şu şekilde kullanmak için düzelttim : REV=`git svn info | grep 'Last Changed Rev:' | sed -E 's/^.*: ([[:digit:]]*)/\1/'`
Sebastien Martin

1
Bu HARİKA! Çok teşekkür ederim. Yamalarımı Fisheye
potasına

10

SVN muhtemelen çıkışını anlayamaz git diff -p, ancak kaba kuvvete başvurabilirsiniz:

  1. Deponuzdan iki klon yapın
  2. Tek bir klonda en son içeriklerinizi kontrol edin
  3. Diğer klon kontrolünde, svn yukarı akışına eşdeğer olan şey. Önceden planladıysanız, kendi şubesinde bir svn kopyasına sahip olursunuz veya son svn sürümünü etiketlediniz. Önceden planlamadıysanız, svn durumuna en yakın olan git SHA1 karmasını bulmak için date veya gitk'i kullanın.
  4. Şimdi diff -riki klonun üzerinden geçerek gerçek bir yama hesaplayın .

12
Ya da @ Nicholas-smith'in tavsiyesini takip edin ve git diff --no-prefix > somefile.diffgit deponuzu çalıştırın ve yamayı patch -p0 < somefile.diffprojenin köküne uygulayabilmeleri için herhangi bir svn kullanıcısına gönderin .
DavidG

10

Subversion <1.6, yama desteğine sahip değildir. Görünüşe göre Subversion 1.7 yamaların uygulanmasına izin verecek ve birleşik diff'e git / hg uzantıları YAPILACAKLAR listemizde.


4

Gerçekten de 2008 başındaki bir özellik isteğidir

Linus Torvalds o sırada şunları söyledi:

Bu nedenle, "git diff yapma" demek için daha güçlü bir şeye ihtiyacınız olduğunu ve bunun da en azından yeniden adlandırma algılamasına izin vermemesi gerektiğini iddia ediyorum.
Açıkçası, mevcut git yamalarını kabul etmeyecek kadar aptal olan herhangi bir program (örneğin, TortoiseSVN), o zaman lanet olsun, sadece en önemsiz kısmını devre dışı bırakmamalıyız. Biz etkinleştirmemenizi emin olmalısınız herhangi oldukça önemli uzantılarının:
bunları görmezden o diff yanlış anlar anlamına geliyorsa ToirtoiseSVN, onları görmezden açsa bile, hiç izin verilmemelidir.

Nedeni bu olabilir

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

Mayıs / Temmuz 2008'de Git1.5.6'da tanıtıldı (Yine de test etmedim)


0

Git bash run'dan yaptığınız değişikliklerin yerel git şubenizin üzerine uygulandığından ve yeniden yüklendiğinden emin olun:

git göster --pretty >> myChangesFile.patch


0

Nicholas tarafından sağlanan kabul edilen cevap, a) farkta ikili dosyalar olduğu veya b) Windows Git'te çalıştığınız ve boşluklu dizinlere sahip olduğunuz durumlar dışında iyi çalışıyor. Bunu çözmek için ikili dosyaları yok saymak için yuvalanmış bir git diff komutu ve boşluklardan kaçmak için sed komutu eklemem gerekiyordu. Yazmak biraz zahmetli, bu yüzden bir takma ad oluşturdum:

[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"

Sonra yazarsanız:

git svnpatch Feature123

... şube yöneticisi ile şube Feature123'ün birleştirme tabanı arasındaki farklarla Feature123.patch bir yama dosyası oluşturulacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.