2015-04-06 674 views
1

在我的SVN中繼中,我刪除了一個目錄,並在一次提交中重新添加它。 現在,試圖獲得「svn日誌」我只能看到那個提交的歷史,沒有我過去做過的所有改變。我知道這是有道理的,因爲刪除和重新添加文件,但我想恢復整個事情並恢復我的歷史。我怎樣才能做到這一點?在SVN中恢復刪除文件的歷史記錄

附加信息和詳細信息: 我正在SVN的樹幹分支上工作。爲了更新樹幹分支,我使用普通差異手動更新文件,而不是使用「svn merge」命令。對於添加到主幹的新文件,我手動將「svn add」添加到我的分支中,刪除(svn rm)也是如此。 當我想合併分支到樹幹時,我的一個同事建議我「svn合併」分支(並且我在這個過程中解決了很多衝突),然後「svn merge --reintegrate」樹枝從分支並轉交給中繼線。 與所有衝突一起,我刪除了整個目錄,將其提交給分支,將其重新添加到分支並再次提交。 現在「merge --reintegrate」帶來了該目錄的刪除 - 讀取,並且提交導致所有歷史消失。 我真的只想恢復整個事情,所以我可以開始乾淨(我已經知道如何使這次提交正確,但我不知道如何恢復和恢復歷史記錄)。

編輯:我試圖獲得一些我知道從this question刪除的文件的日誌。修訂版4129是刪除 - 重新添加,並且4120是我最後一次編輯其中一個文件的時間。 「svn log -r4129文件」只列出了我沒有記錄的最新提交。 「svn log -r4120 file」返回單行「--------」。 我認爲這個問題的主要區別在於我也在同一個提交中重新添加了文件,而不是僅僅刪除。

+0

對不起,我誤解了你。我以爲你只是想查看歷史記錄,但是你希望存儲庫看起來好像你的刪除從未發生過,對嗎?我不相信有辦法做到這一點。 –

+0

@PatrickQuirk是的,這就是我想要的。我相信在那裏應該離開,考慮如果我在整個混亂之前「修復」修改,我可以查看我的正確歷史。我正在尋找類似的東西:「svn up -r1000(1001是錯誤提交); svn commit -m」恢復歷史記錄「 – itzhaki

+0

[檢查已刪除文件的歷史記錄]的可能重複(http://stackoverflow.com/問題/ 401331 /檢查歷史的刪除文件) – bahrep

回答

3

在我的SVN中繼中,我刪除了一個目錄,並在一次提交中重新添加它。

不好,程序員!沒有甜甜圈給你!

你所做的就是創建一個完全不同的目錄,而是一個具有相同的名稱。對你來說,他們看起來一樣。對於Subversion來說,這兩個目錄沒有任何關係。

你爲什麼要刪除舊目錄,並創建一個新的目錄名稱相同?

您要還原?找到你刪除,並在svn log添加的目錄,並嘗試本次的改版:

$ svn merge -c -$rev 

哪裏$rev是您刪除,並添加回目錄在日誌中的修訂。這就是你如何刪除你在Subversion中所做的任何更改。

您可以在命令中指定多個-c $rev。如果這產生衝突,你可能不得不採取稍微不同的方式。在那個版本中,你將不得不使用來鎖定來固定目錄修訂版,因爲它在先前版本中看起來是這樣的。比方說,你的日誌顯示你在修訂12345刪除目錄foo,現在你需要把它找回來:

首先,刪除當前目錄foo

$ svn delete foo 

現在,複製foo從修訂回之前的在該目錄仍然存在時刪除。由於它在版本12345中被刪除,我們需要從版本12344複製:

$ svn cp $REPO_URL/trunk/[email protected] . 

這應該還原舊副本。

附加信息和細節:我正在SVN的樹幹分支。爲了更新樹幹分支,我使用普通差異手動更新文件,而不是使用「svn merge」命令。對於添加到主幹的新文件,我手動將「svn add」添加到我的分支中,刪除(svn rm)也是如此。

我需要喝一杯......

你在做什麼是合併,但不告訴你顛覆做了合併。如果你現在在Subversion中進行合併,你會得到一堆合併衝突,因爲Subversion會在分支和中繼中看到相同的文件區域。

當你添加新的文件到分行,這是一個完全不同的文件比在樹幹。它可能是相同的名稱,並且位於相同的目錄中,但是由於您已將其添加到分支中,因此無法將該文件中的trunk的更改合併到該分支中。

如果可能的話,刪除在樹枝上的文件,並從行李箱複製。這樣,中繼線中的更改可以合併到分支中。

它得到我們的東西非常,非常重要的是:不要做一個附加創建一個分支。總是從樹幹複製樹枝(或從樹枝分支)。否則,該分支和中繼不共享相同的歷史記錄。如果你還沒有完成最初的副本,你永遠不會使用Subversion合併。分行和行李不共用歷史記錄。

有時候更容易手動將更改添加到分支,而不是從主幹合併。例如,分支上的更改與主幹上的更改不同。在這種情況下,你可以使用--record-only讓顛覆知道你做了合併反正:

$ svn merge --record-only -r12345 $REPO/trunk . 

上面將記錄變化的合併設定了12345分支上完成的,和Subversion不會嘗試再次合併。

合併是你的朋友。不要試圖繞過它。一旦你明白Subversion需要在分支和合並的分支/樹幹之間有一個共同的祖先,Subversion在合併方面做得相當不錯。使用svn cp來建立這種關係。

+0

非常感謝你的提示,看起來我只是開始了整個事情一團糟,肯定是一個教訓,幸運的是,我們將在一週內將我們的存儲庫轉換爲GIT,並將GIT管理編輯忽略所有問題,並正確顯示所有歷史記錄。 – itzhaki

-1

您可以使用顯示該目錄的原始歷史記錄真正恢復此操作的唯一方法是使用在服務器上運行的svnadmin dump/load命令來重新創建存儲庫。你所做的任何合併或其他正常的svn命令只會導致更多的額外提交在歷史上已有的剪輯之上。也許這樣的事情對你來說是可以接受的,但這不是你的問題所在。

因此,使用svnadmin,您要做的是將存儲庫的內容轉儲到文件中,並添加一個選項,以便在刪除目錄之前只包含修訂版。然後將該轉儲文件加載到新的存儲庫中。然後,您的存儲庫就像刪除發生之前一樣。現在,從理論上講,你應該可以在刪除/讀取之後再做一次修改,將它們加載回新的存儲庫,爲您提供一個完美的新存儲庫,並且不會中斷,並且包含所有內容。雖然這可能不起作用,但取決於可以將哪些更改混合到跳過的修訂中。

你可能會想上的命令在SVN參考過讀了,但這裏是它可能看上去是這樣的:

svnadmin的轉儲C:\庫\ my​​repo -r4128> myrepo.dump
svnadmin的負載C:\庫\ my​​newrepo < myrepo.dump

svnadmin的轉儲C:\庫\ my​​repo -r4130:HEAD --incremental> myrepo2.dump
svnadmin的負載C:\庫\ my​​newrepo < myrepo2.dump

相關問題