11 月 072007
 

使用 Subversion 偶而就會遇到有人不小心把一堆不該存在的檔案 commit 進來了,這在去年寫的一篇「svndumpflter with wildcards support ?」有提到從歷史記憶中去除個別檔案的方式

但如果你能即時發現最新的一個(或幾個) commit(s) 的任何更動都是不該發生的(通常就是有人做了蠢事),那麼在有其他正常人繼續 commit 之前,其實是有蠻好的挽救機會的 💡

假設你的 repository 名稱是 foobar,最新的 revision number 是 r105,但是你即時發現 r101 ~ r105 都是某人亂搞的結果,那麼在 r106 commit 之前,應該還有機會把時光倒轉到 r100 那時清純未受污染的狀態..

廢話不多說,下面是作法

# cd /home/svn
# svnadmin create foobar.new
# svnadmin dump -r0:100 foobar | svnadmin load --force-uuid foobar.new
# mv foobar foobar.old
# mv foobar.new foobar

做完以上動作後再把該設的權限弄好,hooks 下的東西 copy 回去就可以了

如果有其他人在這段動作完成前 checkout 了 r101~r105 之間的版本,就跟他們說他們看到鬼了,請他們砍掉 source tree 重新 checkout 一份吧 🙄

上面這段作法最重要的地方是 –force-uuid 這個選項,沒有加這個選項會使得回復的 repository 的 UUID 跟原本的不同,進而導致之前已經 checkout 的 working copy 都會認不得新的 repository!

如果還來不及作上述動作,就有其他正常人 commit 東西進來了,其實也不會很麻煩,反正做完回復動作後,統統當作沒發生過,再叫作蠢事的人請一頓飯,拜託其他人把新的修改再改一次就好了

 Posted by at 23:09

  One Response to “Subversion: revert a commit [時光倒轉]”

  1. […] Subversion: revert a commit [時光倒轉] […]

歡迎留下您的意見