Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用git svn移动/重命名目录_Git_Svn_Git Svn - Fatal编程技术网

使用git 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

我的公司使用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 /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命令使用不同的重命名检测技术,例如,
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来保持简单。