2017-04-10 53 views
1

我的公司使用SVN存儲庫,但我想使用Git。目前我使用Git SVN,但是當我移動或重命名的目錄有幾個在Git中的文件和「混帳SVN dcommit」這樣的變化,在SVN倉庫這導致到單個文件移動:使用git-svn移動/重命名目錄

Changed paths: 
    D /directory/file1 
    D /directory/file2 
    D /directory/file3 
    D /directory/file4 
    ... 
    A /renamedDirectory 
    A /renamedDirectory/file1 (from /directory/file1:67918) 
    A /renamedDirectory/file2 (from /directory/file2:67918) 
    A /renamedDirectory/file3 (from /directory/file3:67918) 
    A /renamedDirectory/file4 (from /directory/file4:67918) 
    .... 

相反,我希望看到這樣的事情:

Changed paths: 
    D /directory 
    A /renamedDirectory (from /directory:67918) 

即完整的目錄重命名。有什麼辦法可以解決這個問題嗎?

+0

對於像這樣的花哨的東西,我會使用svn客戶端(即使僅用於此操作)。 – eftshift0

+2

我會建議在大多數工作中使用git-svn,但是對於像這樣的Subversion特定功能,只需要做任何你需要直接使用svn的方法。問題解決了。 –

+0

請注意,在某些方面git和svn是完全不同的。準備好了解每種工具如何在正確的情況下做到事情並使用正確的工具。如果你對此沒有準備,我會堅持使用svn來保持簡單。 –

回答

2

當在git中重命名(移動)目錄時,它只有git只移動文件,而不是目錄。

如果我重命名一個名爲pdfs文件夾pdfs2

$ git mv pdfs pdfs2 

$ git status 

renamed: pdfs/filea -> pdfs2/filea 
renamed: pdfs/fileb -> pdfs2/fileb 

所以我覺得這是如何的git工程等混帳SVN這樣工作了。

git沒有辦法說「我100%確定這是一個完整的目錄移動操作」,因此將其轉換爲SVN作爲目錄移動。 Git只知道/關心這些文件。


另外:你會發現,如果你試圖提交一個空目錄git會抱怨:

$ mkdir afolder 
$ git add afolder && git commit -m "Added afolder" 
On branch master 
nothing to commit, working tree clean 

這又是因爲Git並不關心目錄,只是文件。

1

有當涉及到的文件移動和複製SVN和Git之間的主要區別:

  • Subversion保存拷貝在存儲庫執行的每一個複製操作元數據。

  • Git不保留這種類型的元數據,它依靠某些啓發式來確定文件或目錄是否被複制或移動。

不同的Git命令使用不同的重命名檢測技術,例如, git log --stat -M不檢測目錄重命名:

git log --stat -M 
... 
{directory => renamedDirectory}/file1 
{directory => renamedDirectory}/file2 
{directory => renamedDirectory}/file3 
{directory => renamedDirectory}/file4 

然而,git-svn不嘗試發送時使用Git的承諾SVN倉庫,因此檢測改名目錄,拷貝由git-svn產生不反映元數據目錄重命名你預計,它將重新命名相應修訂中的單個文件。

我們採取了不同的方法,SubGit這是git-svn一種替代方案:當一個移動在Git目錄:

$ git mv directory renamedDirectory 

,然後推動這種變化使SubGit-Git倉庫:

$ git commit -m 'Rename directory to renamedDirectory' 
$ git push 

SubGit確實將此更改轉換爲Subversion存儲庫中的目錄重命名:

Changed paths: 
    D /directory 
    A /renamedDirectory (from /directory:123) 

如果你覺得在Subversion版本庫中保存這種元數據非常重要,你可以考慮嘗試SubGit。這是一個quick start guide