2009-09-10 39 views
70

所以 - 我以前有一個名爲mysql的目錄。我刪除了它,並決定從頭開始 - 但是當我嘗試創建新的mysql目錄 - 我一直運行到「文件已存在」的錯誤:Subversion的奇怪問題 - 試圖重新創建一個用於存儲庫的目錄時,「文件已存在」

support:/etc/puppet/modules# mkdir mysql 
support:/etc/puppet/modules# svn add mysql/ 
A   mysql 
support:/etc/puppet/modules# svn commit -m " Test" 
Adding   modules/mysql 
svn: Commit failed (details follow): 
svn: File already exists: filesystem '/var/lib/svn/puppet/db', transaction '11-r', path '/trunk/modules/mysql' 
support:/etc/puppet/modules# svn delete mysql 
svn: Use --force to override this restriction 
svn: 'mysql' has local modifications 
support:/etc/puppet/modules# svn --force delete mysql 
D   mysql 

我看到了一些其他職位建議強制更新

support:/etc/puppet/modules# svn status 
support:/etc/puppet/modules# svn update 
At revision 11. 
support:/etc/puppet/modules# svn mkdir mysql 
A   mysql 
support:/etc/puppet/modules# svn commit -m "Test" 
Adding   modules/mysql 
svn: Commit failed (details follow): 
svn: File already exists: filesystem '/var/lib/svn/puppet/db', transaction '11-s', path '/trunk/modules/mysql' 

回答

11

我設法解決它通過恢復到我有mysql目錄的最後一個版本,然後刪除目錄的內容,把新的內容,並檢查新的信息回來。雖然我很好奇,如果有人能更好地解釋那裏發生了什麼。

1

我不確定這是否對您有所幫助,但我想當您在刪除它之後執行svn add mysql時,它只會重新實例化目錄(因此請勿自己執行mkdir)。如果你自己創建一個目錄,svn需要在其中有一個.svn目錄,因爲它已經「知道」它。

+0

聽起來可行的爲好,但因爲我得到了它的更新到舊的版本,並從那裏變化的工作,我真的不能檢驗這個理論。謝謝你的提示。 – gnarf 2009-09-10 22:23:30

12

已經有這種類型的問題。

我的解決辦法是:

從SVN刪除文件夾,但保持文件夾的副本某處,提交更改。 在備份副本中,遞歸刪除其中的所有.svn文件夾。爲此,您可以運行

#!/bin/bash 

find -name '.svn' | while read directory; 
do 
    echo $directory; 
    rm -rf "$directory"; 
done; 

刪除本地存儲庫並重新檢出整個項目。 不知道部分刪除/結帳是否足夠。

問候

+2

那就是基本上這個東西開始的地方,我很久以前就刪除了'mysql',而我 - 但是當我厭倦了「文件已經存在」時,我只是試着做一個空目錄......它仍然不會不添加它。另外'find -name'.svn'-exec rm -rf {} \;'執行你的bash的東西的方法要短得多 – gnarf 2009-09-10 22:18:37

+0

哦 - 沒有注意到刪除整個存儲庫並再次檢出直到第二個閱讀...如果我再次遇到這個問題,我一定會嘗試 - 謝謝! – gnarf 2009-09-10 22:22:04

+0

好命令,將取代我的你的,謝謝。我曾多次添加問題,並且在乾淨的環境中檢查始終幫助我解決問題。希望這對你也有效,如果你再次遇到它。祝賀 – Atmocreations 2009-09-10 22:56:17

62

我有這樣一個問題,當我刪除一個文件夾(和子文件夾),前往從頭重新創建。你從手動刪除和重新添加文件夾(而文件似乎應付與此確定)得到此錯誤。

一些令人沮喪的插科打諢後,發現我不得不:

  1. 移動衝突的文件夾(在Windows上使用TortoiseSVN)出的工作副本的(這樣我就不會失去我的工作正在進行中)
  2. 做一個svn update它增加了舊文件/文件夾返回到工作拷貝
  3. svn delete文件夾
  4. commit
  5. 複製新的文件夾回工作副本(確保你刪除裏面的所有.svn目錄)
  6. commit

不幸的是(A)需要兩次提交,(B)丟失文件修訂歷史記錄,因爲只有它追溯到最近的重新添加(除非有人可以解釋如何解決這個問題)。解決這兩個問題的另一種解決方案是跳過步驟3和4,唯一的問題是舊的/不必要的文件可能仍然存在於您的目錄中。你可以手動刪除這些。

很想聽聽其他人對此的其他見解。

Simon。


[更新] OK,我再有同樣的問題,就在這時,但有問題的文件夾是不是在最後一次提交的,因此一個update沒有恢復它。相反,我不得不瀏覽存儲庫和delete違規文件夾。然後我可以add文件夾回到並且commit成功。

+0

+1 simillar問題 - 只是目錄,而不是文件。恢復然後svn刪除,然後svn添加,它就消失了。奇。 – serg10 2009-11-23 14:40:32

+2

+1通過瀏覽爲我修復的存儲庫直接刪除有問題的文件夾。 – 2013-01-04 10:47:13

1
  1. 重命名爲臨時
  2. 新路徑還原新的路徑(不溫!),所以SVN不會嘗試提交它
  3. 提交更改的其餘
  4. 複製在倉庫裏的路徑:SVN複製-m「複製路徑」 -r
  5. 更新你的工作拷貝
  6. MV從臨時的所有文件到新的路徑,這是從更新
  7. 提交由於r你的本地修改時空視點
  8. 擁有美好的一天,包括歷史;-)
0

這種情況發生,如果有在庫對象,由當前事務創建。

簡單的場景:

  1. 結賬某些目錄的兩倍,爲DIR1和DIR2
  2. 使雙方
  3. 'SVN的mkdir測試' 使從DIR1
  4. 嘗試提交作出承諾DIR2( SVN將返回此錯誤

從兩個工作副本中添加相同的文件時是同樣的事情。

7

這是一個討厭的...神祕的錯誤,沒有明確的修復。

更新/恢復/提交沒有在我的情況下工作。我沒有做任何奇怪的事 - 只是一些svn動作。

什麼工作對我來說是:

svn remove offender 
svn commit 
cd .. 
rm -fR parent 
svn up parent 
cd parent 
svn remove offender again 
svn commit 
copy offender back in (minus .svn dirs) 
svn add 
svn commit 

奇怪,至少可以說。基本上,由於某種原因,svn remove --force offender沒有完全移除。這就是錯誤信息所說的內容。只有刪除父母,然後更新父母,這是否變得明顯,因爲然後罪犯再次出現! svn再次刪除罪犯,然後妥善刪除它。

+1

爲我工作。謝謝! – typeoneerror 2011-02-25 00:58:11

1

我在Netbeans上運行的項目上遇到了這個問題。 我只需右鍵單擊該文件並進行更新以修復它(在SVN之後)。

16

有類似的問題。要解決它,從svn trunk更新本地文件的優先級選項。

svn update path/ --accept=mine-full 

之後您可以照常提交。當然,小心使用它。

+0

我只有一個文件處於添加狀態。這svn更新命令爲我解決了衝突。 – 2013-11-19 15:31:26

+0

你必須每次都運行這個命令。它不會使原始錯誤消失。 – 2016-08-18 13:50:55

1

該解決方案順利合併,不會丟失歷史:

  1. 移動/工作拷貝/罪犯到一個臨時位置。
  2. 運行svn + SSH的svn籤://svn.example.com/repo/offender到/工作拷貝/罪犯。
  3. 手動將文件從臨時位置移動到新的結帳。
  4. 刪除臨時位置。
-1

問題是結帳發生在筆記本電腦上,在這種情況下,顛覆無法應付脫機同步。這個問題可以在其他筆記本電腦上重現,而在桌面上,我沒有問題檢出同一個存儲庫。

我希望這個答案西港島線幫助你,我花了相當長的找出來。

0

根據Atmocreation的解決方案,除非您不需要重新簽出整個項目,如果您現有的工作正在進行中,這很有用。

假設你有一個工作副本:

/foo/ 

其中包含目錄:

/foo/bar/baz 

和你在提交收到錯誤消息:

svn: File already exists: filesystem '/foo/bar' 

備份酒吧內容:

mkdir -p ~/tmp/code_backup 
cp -r /foo/bar ~/tmp/code_backup 

刪除從備份中的.svn目錄的控制。確保你得到這個命令正確,否則你可以做非常嚴重的損害!如果您不確定,請手動刪除它們。

find ~/tmp/code_backup/bar -name .svn -type d -exec rm -rf {} \; 

仔細檢查副本是相同的:

diff -r -x .svn dist ~/tmp/code_backup/dist 

從工作副本刪除違規的目錄: CD /富 室射頻酒吧

然後它從恢復repository:

cd /foo 
svn update bar 

Copy back從備份修改的文件:

cp -r ~/tmp/code_backup/bar /foo/ 

您現在應該可以提交沒有錯誤。

1

我今天就遇到了這個問題,當Xcode的一個分支合併過程中墜毀。不知何故文件上傳到svn存儲庫,但它沒有正確記錄在svn數據庫中。我跑在目錄下面的命令在本地文件存在:

svn add bad.file 
svn commit -m "Re adding bad.file" 

成功:

svn revert bad.file 
svn del svn://my.svnserver.com/svnDB/path/to/the/offending/file/bad.file 

然後,我從我的本地系統重新添加的文件!

0

你需要的是svn'export'命令。有了這個,您可以將文件或整個目錄樹置於另一個分支的另一個修訂版本的狀態中。

因此,像

rm file #without 'svn' in front! 
svn export myrepo/path/to/[email protected]<revision> . 
svn commit 
相關問題