使用git svn移动/重命名目录
我的公司使用SVN存储库,但我想使用Git。目前我正在使用git svn,但当我移动或重命名一个目录时,其中包含git中的多个文件和“git svn DCOMIT”这样的更改,在svn存储库中,这会导致单个文件移动:使用git svn移动/重命名目录,git,svn,git-svn,Git,Svn,Git Svn,我的公司使用SVN存储库,但我想使用Git。目前我正在使用git svn,但当我移动或重命名一个目录时,其中包含git中的多个文件和“git svn DCOMIT”这样的更改,在svn存储库中,这会导致单个文件移动: Changed paths: D /directory/file1 D /directory/file2 D /directory/file3 D /directory/file4 ... A /renamedDirectory A /renamedDi
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)
i、 完整目录重命名。有什么办法可以解决这个问题吗?在git中重命名(移动)目录时,git只移动文件,而不是目录
如果我将名为pdfs
的文件夹重命名为pdfs2
$ git mv pdfs pdfs2
$ git status
renamed: pdfs/filea -> pdfs2/filea
renamed: pdfs/fileb -> pdfs2/fileb
所以我认为git就是这样工作的,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不关心目录,只关心文件。在文件移动和复制方面,SVN和git有一个主要区别:
- Subversion从存储库中执行的每个复制操作的元数据中保留副本
- 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
生成的元数据复制不会反映您期望的目录重命名,而是在相应的修订版中重命名单个文件
我们采用了一种不同的方法,它是git svn的替代方法:当使用git移动目录时:
$ git mv directory renamedDirectory
然后将此更改推送到启用子Git的Git存储库:
$ git commit -m 'Rename directory to renamedDirectory'
$ git push
Changed paths:
D /directory
A /renamedDirectory (from /directory:123)
SubGit将此更改转换为Subversion存储库中的目录重命名:
$ git commit -m 'Rename directory to renamedDirectory'
$ git push
Changed paths:
D /directory
A /renamedDirectory (from /directory:123)
如果您认为在Sudio知识库中保存这种元数据很重要,您可以考虑尝试SugGIT。这里有一个。
对于像这样的奇特的东西,我会使用svn客户端(即使只用于此操作)。我建议在大多数工作中使用git svn,但对于类似于Subversion的特定功能,只需直接使用svn即可。问题解决了。请注意,在某些方面git和svn是完全不同的。准备好了解每个工具是如何工作的,并在正确的环境中使用正确的工具。如果你对此毫无准备,我会坚持使用svn来保持简单。