Subversion'da zaten taahhütlü olan günlük mesajını nasıl düzenleyebilirim?


550

Subversion'da belirli bir düzeltmenin günlük iletisini düzenlemenin bir yolu var mı? Taahhüt mesajımda yanlışlıkla daha sonra kafa karıştırıcı olabilecek yanlış dosya adı yazdım.

Gördüğüm ben yanlış Git mesajı işlemek nasıl düzeltebilirim? , ancak bu sorunun çözümü Subversion için benzer görünmemektedir (göre svn help commit).


26
Bu soruyu değerlendirecektim, ama sonra 4 ay önce yaptığımı fark ettim :)
oksayt

6
Kod ise, bazı yorumlar yapın ve uygun yorumlarla tekrar işlem yapın. Hatayı yansıtan yorumlarınızda sorun yoksa, çok daha az çaba ve çok daha hızlıdır. Değilse, Kamil Kisiel'in çözümü bunu yapmanın doğru yolu.
Marty

pre-revprop-changeTaahhüt eden kullanıcının günlüklerini taahhütten sonra 3 saate kadar değiştirmesine izin veren mükemmel bir komut dosyası vardır. Bu, esneklik / doğru günlükler ile deponun sadakatini korumak arasında mükemmel bir uzlaşmadır: wandisco.com/svnforum/threads/…
jwa

eğer dosyayı değiştirmek ama yine de yeni bir taahhüt mesajını eklemek istediğiniz olamaz o zaman yapabileceğinizsvn propset dummyproperty 1 yourfile; svn commit yourfile -m yourmessage
mulllhausen

Yanıtlar:


457

Aslında bunu yapmak için depoya yönetici haklarına (doğrudan veya dolaylı olarak) sahip olmanız gerekir. Depoyu tüm kullanıcıların bunu yapmasına izin verecek şekilde yapılandırabilir veya günlük iletisini doğrudan sunucuda değiştirebilirsiniz.

Bkz bu bölümü içinde Subversion SSS (vurgu benim):

Günlük iletileri, her bir düzeltmeye eklenmiş özellikler olarak depoda tutulur. Varsayılan olarak, günlük iletisi özelliği (svn: log) işlendikten sonra düzenlenemez . Bunun nedeni, revizyon özelliklerinde yapılan değişikliklerin (svn: log olanı) mülkün önceki değerinin kalıcı olarak atılmasına neden olması ve Subversion'ın bunu yanlışlıkla yapmanıza engel olmaya çalışmasıdır. Ancak, Subversion'u bir revizyon özelliğini değiştirmenin birkaç yolu vardır.

İlk yol, havuz yöneticisinin revizyon özelliği değişikliklerini etkinleştirmesidir. Bu, "revprop-değişim öncesi" adlı bir kanca oluşturarak yapılır (bunun nasıl yapılacağı hakkında daha fazla ayrıntı için Subversion kitabındaki bu bölüme bakın). "Değişiklik öncesi değişiklik" kancası değiştirilmeden önce eski günlük iletisine erişebilir, böylece bir şekilde koruyabilir (örneğin, bir e-posta göndererek). Revizyon özelliği değişiklikleri etkinleştirildikten sonra, --revprop anahtarını svn propedit veya svn propset öğesine geçirerek aşağıdakilerden biri gibi bir revizyonun günlük mesajını değiştirebilirsiniz:

$svn propedit -r N --revprop svn:log URL 
$svn propset -r N --revprop svn:log "new log message" URL 

burada N, günlük mesajını değiştirmek istediğiniz revizyon numarasıdır ve URL, deponun konumudur. Bu komutu çalışan bir kopyadan çalıştırırsanız URL'yi bırakabilirsiniz.

Bir günlük mesajını değiştirmenin ikinci yolu svnadmin setlog kullanmaktır. Bu, deponun dosya sistemindeki konumuna bakılarak yapılmalıdır. Bu komutu kullanarak uzak bir havuzu değiştiremezsiniz.

$ svnadmin setlog REPOS_PATH -r N FILE

burada REPOS_PATH depo konumu, N, günlük mesajını değiştirmek istediğiniz revizyon numarası ve FILE yeni günlük mesajını içeren bir dosyadır. "Değişiklik öncesi değiştirme" kancası yerinde değilse (veya bir nedenle kanca komut dosyasını atlamak istiyorsanız) --bypass-hooks seçeneğini de kullanabilirsiniz. Ancak, bu seçeneği kullanmaya karar verirseniz, çok dikkatli olun. Değişikliğin e-posta bildirimleri veya düzeltme özelliklerini takip eden yedekleme sistemleri gibi öğeleri atlıyor olabilirsiniz.


15

1
İşte svnadmin seçenek svn-change-commit
albfan

2
Teşekkürler! Cevaptan 6,5 yıl sonra hala faydalı. :-)
Michael

Propedit yöntemi az çok çalıştı; ancak, repo tarayıcısında yansıtacak günlük değişikliğini alamadım. Windows'da yalnızca güncellenmiş oturum açma svn komut satırını görebiliyordum. Günlük önbelleğini son adım olarak yenilemek zorunda kaldım: stackoverflow.com/questions/25750249/…
user_007

89

Bu komutu çalıştırdığınızda,

svn propedit svn:log --revprop -r NNN 

ve şu mesajı görmeniz durumunda:

DAV isteği başarısız oldu; deponun devir öncesi değişim kancasının başarısız olması veya mevcut olmaması mümkündür

Subversion, günlük mesajlarını değiştirmenize izin vermediğinden, sürümleri değiştirilmediği ve kalıcı olarak kaybolacağı için.

Unix tarafından barındırılan SVN

Subversion sunucunuzdaki kancalar dizinine gidin (~ / svn / reponame'i deponuzun diziniyle değiştirin)

cd ~/svn/reponame/hooks

Uzantıyı kaldırın

mv pre-revprop-change.tmpl pre-revprop-change

Yürütülebilir yap (chmod + x yapamaz!)

chmod 755 pre-revprop-change

Kaynak

Windows tarafından barındırılan SVN

Kancalar dizinindeki şablon dosyaları Unix'e özgü oldukları için kullanılamaz. Bir Windows toplu iş dosyasını pre-revprop-change.batkancalar dizinine, örneğin burada sağlanan dosyaya kopyalamanız gerekir .


1
Eğer parantez içinde yazdım Neden "olabilir değil chmod + x yap!"?
Havari

1
Burada aynı fikri uygulayan küçük bir senaryo oluşturdum blog.mmonem.com/enable-changing-svn-log
mmonem

SVN_EDITOR, VISUAL veya EDITOR kullanılmadan önce ayarlanmalıdır svn propedit
Gerd

48

SSS'de bahsetmediğim kullanışlı bir varyasyon. Bir metin düzenleyicisi belirterek geçerli mesajı düzenleme için geri gönderebilirsiniz.

svn propedit svn:log --revprop -r N --editor-cmd vim

17
Kancanın oluşturulmasını gerektirir - bu da yönetici hakları gerektirir. svn: Repository has not been enabled to accept revision propchanges; ask the administrator to create a pre-revprop-change hook
Matt

Günlüğü etkinleştirmek için bir komut dosyası var: blog.mmonem.com/enable-changing-svn-log
mmonem

37
svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt

Google Code kullanıyorum, bu şekilde yapabileceğimi sanmıyorum, ama teşekkürler.
Jeremy Ruten

4
"Depo revizyon değişimlerini kabul etmek için etkinleştirilmedi" ile propedit yöntemi başarısız olduğu için bu benim için çalıştı. Teşekkürler!
pfctdayelise

1
Komutu doğrudan verdiği için +1 :-) apache.org şu anda kapandı ve verilen herhangi bir bağlantıyı takip edemedim ...
Rafa

Bu cevap daha fazla puanı hak ediyor! Bu daha iyidir çünkü kullanmak için kancayı ayarlamanız gerekmez.
Peri Hartman

1
Bu cevap için yumru, kanca ayarlamadan benim için çalıştı, ayrıca günlük "tarih / saat" revizyonu değişmedi, sadece mesaj, hangi tam olarak umuyordum.
segFaultCoder

17

Son zamanlarda bununla da görevlendirildim.

Programcılarımızın yalnızca kendi taahhüt mesajlarını değiştirmelerine izin vermek ve ne kadar geriye izin verdiklerini kısıtlamak istedik. O gün taahhüt edilen günlük mesajlarını değiştirmelerine, yazım hatalarını düzeltmelerine vb. İzin verdiklerine karar verdik.

Diğer birkaç çevrimiçi örneğe baktıktan sonra bunu birlikte hackledim, bir pencere ortamındayız, bu yüzden bu bizim içeriğimiz pre-revprop-change.bat:

@ECHO OFF

set repos=%1
set rev=%2
set user=%3
set propname=%4
set action=%5

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow changes to svn:log. The author, date and other revision
:: properties cannot be changed
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if /I not '%propname%'=='svn:log' goto ERROR_PROPNAME

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow modifications to svn:log (no addition/overwrite or deletion)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if /I not '%action%'=='M' goto ERROR_ACTION

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow user to modify their own log messages
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set AUTHOR=
for /f "delims=" %%a in ('svnlook author -r %REV% %REPOS%') do @set AUTHOR=%%a

if /I not '%AUTHOR%'=='%user%' goto ERROR_WRONGUSER

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow user to modify log messages from today, old messages locked down
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set DATESTAMP=
for /f "delims=" %%a in ('svnlook date -r %REV% %REPOS%') do @set DATESTAMP=%%a

for /F "tokens=1-2 delims= " %%a in ("%DATESTAMP%") do (
 set DATESTAMPDATE=%%a
 set DATESTAMPTIME=%%b )

:: Expects DATESTAMPDATE in the format: 2012-02-24
for /F "tokens=1-3 delims=-" %%a in ("%DATESTAMPDATE%") do (
 set DATESTAMPYEAR=%%a
 set DATESTAMPMONTH=%%b
 set DATESTAMPDAY=%%c )

:: Expects date in the format: Thu 08/01/2013
for /F "tokens=1-4 delims=/ " %%a in ("%date%") do (
 set YEAR=%%d
 set MONTH=%%b
 set DAY=%%c )

if /I not '%DATESTAMPYEAR%'=='%YEAR%' goto ERROR_MSGTOOOLD
if /I not '%DATESTAMPMONTH%'=='%MONTH%' goto ERROR_MSGTOOOLD
if /I not '%DATESTAMPDAY%'=='%DAY%' goto ERROR_MSGTOOOLD

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Make sure that the new svn:log message contains some text.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set bIsEmpty=true
for /f "tokens=*" %%g in ('find /V ""') do (
 set bIsEmpty=false
)
if '%bIsEmpty%'=='true' goto ERROR_EMPTY

goto :eof

:ERROR_EMPTY
echo Empty svn:log properties are not allowed. >&2
goto ERROR_EXIT

:ERROR_PROPNAME
echo Only changes to svn:log revision properties are allowed. >&2
goto ERROR_EXIT

:ERROR_ACTION
echo Only modifications to svn:log revision properties are allowed. >&2
goto ERROR_EXIT

:ERROR_WRONGUSER
echo You are not allowed to modify other user's log messages. >&2
goto ERROR_EXIT

:ERROR_MSGTOOOLD
echo You are not allowed to modify log messages older than today. >&2
goto ERROR_EXIT

:ERROR_EXIT
exit /b 1 

Düzenleme: Bunun için orijinal fikir bu iş parçacığından geldi :


7
Nedense, benim sistemde (Server 2012 ve VisualSVN çalıştıran), son tarih kontrolünde if /I not '%DATESTAMPDAY%'=='%DAY%' goto ERROR_MSGTOOOLD, iki değişken etrafında çift tırnak geçmek zorunda kaldı. (Bunun ne kadar sürdüğüne inanmayacaksınız.) Aksi takdirde "== '02' şu anda beklenmedik bir şey" (ayın 2. gününde) alırdım. Toplu işim bunun neden olduğunu bilecek kadar güçlü değil, ancak başkalarının garip sorunlarla karşılaşması durumunda yardımcı olabilir.
Carl Bussema

@CarlBussema: Bu çöplük için teşekkürler. Bana çok büyük bir baş ağrısı kurtardın.
Daniel Szabo

1
Ayrıca yukarıdaki komut dosyasında " Tarih biçiminde tarih bekleniyor: Per 08/01/2013" , amerikan tarih biçimi kullanıldığını unutmayın . Yani bu kısmı kullanmıyorsanız, benim durumumda biçim "mm.dd.yy" idi ve hafta günü olmadan.
Zitrax

Bu güzel cevapta harika bir varyasyon: stackoverflow.com/questions/6155/…
NateJ

17

Windows'da Tortoise SVN istemcisini kullanarak:

  1. proje klasörünüzü sağ tıklayın ve "Günlüğü göster" i seçin
  2. Günlük Mesajları penceresinde bir düzeltmeyi sağ tıklayın ve "Günlük mesajını düzenle" yi seçin

Çalışmazsa, sunucudaki SVN'nin kurulum şekli nedeniyle olabilir, burada diğer yanıtları okuyun.


Teşekkürler bu benim için daha kolay bir çözümdü, +1. İzinlerin alınması şarttır.
theGabyRod

12

Tutulma gibi bir IDE kullanıyorsanız, bu kolay yolu kullanabilirsiniz.

Right click on the project -> Team - Show history

Bunda right click on the revision id for your commit and select 'Set commit properties'.

Mesajı buradan istediğiniz gibi değiştirebilirsiniz.


En azından TortoiseSVN'de, kesinleştirme günlüğündeki bir kesinti için kesinleştirme özelliklerini düzenlemeye çalışmak, günlük iletisini doğrudan düzenlemeye çalışmakla aynı hata iletisiyle başarısız olur.
Christian Severin

1
Msgstr "DAV isteği başarısız oldu; deponun revprop değiştirme öncesi kancasının başarısız olması veya var olmaması Deponun revizyon değişimlerini kabul etmesine izin verilmemiş olabilir; yöneticiden revprop değiştirme öncesi bir kanca oluşturmasını isteyin". Ama dediğim gibi: Eclipse yerine TortoiseSVN (yönetici olmayan) kullanıyor. Belki Eclipse bu kancayı oluşturmak için SVN izinlerini hackliyor, bilmiyorum.
Christian Severin

Evet belki. Tutulmada yapmayı deneyin.
mani_nz

@ChristianSeverin, Eclipse kullanırken aynı hata mesajını alıyorum. Kesinlikle Subversion sunucusundan geliyor.
GreenhouseVeg

10

Deponuz revprop değiştirme öncesi kanca ile revizyon özelliklerini ayarlamayı etkinleştiriyorsa, günlük mesajlarını daha kolay değiştirebilirsiniz.

svn propedit --revprop -r 1234 svn:log url://to/repository

Veya TortoiseSVN, AnkhSVN ve muhtemelen diğer birçok alt sürüm istemcisinde bir günlük girişine sağ tıklayıp ardından 'günlük mesajını değiştir'.


2
Subclipse (Eclipse) 'de "Ayar Özelliklerini Ayarla" dır.
pfctdayelise

2

Subversion SSS bu kapsar, ancak böyle tanımsız terimleri kafa karıştırıcı bir demet kullanan REPOS_PATHherhangi bir fiili örnekler vermeden.

Çalışması için birkaç deneme yapmanız gerekebilir, bu nedenle güncellenmiş taahhüt mesajınızı bir dosyaya kaydedin. svn-commit.tmpDosyalardan farklı olarak Subversion, bir sorun olduğunda yazınızı korumaz.

Çalışma dizininizde çalıştırın

svn propedit -r N --revprop svn:log

taahhüt mesajını düzenlemek için. Bu işe yararsa harika! Ancak, muhtemelen svn:logrevizyon özelliği ters çevrilmediğinden ve varsayılan olarak Subversion, kanca komut dosyasıyla pre-revprop-change veya böyle bir kancaya sahip olmadığınız bir hata mesajıyla üzerine yazmanızı engelleyecektir.

Kancaları değiştirmek için, deponun barındırıldığı dosya sistemine erişmeniz gerekir. svn infosize Havuz Kökünü söyleyecektir. Varsayalım ~/svnrepo.

  1. cd için ~/svnrepo/hooks
  2. Bir senaryo pre-revprop-changeveya pre-revprop-change.batsenaryo var mı? Öyleyse, değiştirmeye çalışırsanız geçici olarak iptal edilen kısmını yorumlayın svn:log.
  3. Aksi takdirde, Windows'ta adlı boş bir dosya oluşturun pre-revprop-change.bat. İşte bunu yapmanın bir yolu:

    copy con pre-revprop-change.bat
    ^Z
    
  4. Aksi takdirde, Unix'te çalıştırın

    echo '#!/bin/sh' > pre-revprop-change
    chmod +x pre-revprop-change
    
  5. Çalışan kopyada svn propedit -r N --revprop svn:logtekrar çalıştırın

  6. ~/svnrepo/hooks/svn-revprop-change( .bat) Üzerindeki değişikliklerinizi geri alın

0

Svnforum'da sunucu tarafı ön-rev-prop-değişiklik kancasının güzel bir uygulamasını buldum: https://www.svnforum.org/forum/opensource-subversion-forums/scripts-contributions/8571-pre-revprop-change -shell-script-Commiters-to-change-kendi-log-içinde-x-saat verir

Uygular

  • kullanıcı denetimi, yani sadece kendi taahhüt mesajları düzenlenebilir.
  • Svn yönetici geçersiz kılma; admin her şeyi düzenleyebilir.
  • zaman damgası karşılaştırması: yalnızca belirli bir süreden daha genç olan taahhütler düzenlenebilir

Oradan alın ve dilediğiniz gibi düzenleyin. Orijinal yazar olmadığım için buraya kopyalamamayı tercih ederim ve bunu yapmama izin verecek hiçbir telif hakkı bildirimi yok.

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.