2017-04-10 49 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