2

我在本地使用 git,而我们的远程服务器是 svn。我不得不在工作副本中移动许多文件和文件夹。我做了什么:

  1. git mv SRC_FOLDER DST_FOLDER
  2. git svn dcommit

现在,SVN 存储库包含具有所有旧历史记录的新文件。但是,由于 git 不跟踪空目录,并且由于我没有使用git svn dcommit --rmdir,所有旧目录在 svn reposirtoy 中都是空的,并且新目录不包含旧历史记录。

在我提交更改后,有什么方法可以将旧目录历史记录移动到新目录历史记录中。

4

2 回答 2

0

您能否将所有单个文件和子目录移回原始目录(有历史记录),删除新的(无历史记录)目录,然后从 SVN 工作副本中再次重命名?

于 2012-09-16T07:55:18.170 回答
0

我可以告诉你如何使用 2 个工具来做到这一点:SmartGit(客户端)和SubGit(服务器端,在这里你需要链接到你的 Subversion 的新克隆的纯 Git 存储库)。git-svn 不支持目录移动。

如果大多数文件已移动到同一目录中,两者都支持目录移动检测。最初,您可以使用任何工具移动文件并推送。

步骤 1(选项 1)。您应该通过替换来恢复您当前的提交(确保您没有本地更改):

$ git update-ref my_current_branch <commit_id_before_move>
$ git reset --hard HEAD

步骤 1(选项 2)。...或通过该特定提交的反向合并+提交(然后不会执行分支替换)

$ git revert <commit_with_wrong_move>

第 2 步(选项 1)。现在您应该重新应用您的更改:移动目录

$ git mv SRC_FOLDER DST_FOLDER

第 2 步(选项 2)。...或者只是再次挑选您的更改:

$ git cherry-pick <commit_with_wrong_move>

第 3 步。然后推送您的更改:

对于 SubGit:用于分支替换(即步骤 1 选项 1):

$ git push -f

对于简单的还原(即步骤 1 选项 2):

$ git push

对于 SmartGit,请按“推送”按钮(如果需要强制推送,它会询问)

撤消 + 重做可能会有所帮助,这看起来很奇怪,但是主要操作(目录移动)是在推送级别执行的(当开始转换为 SVN 时),您应该使用正确的工具来完成。

于 2012-09-16T12:37:03.643 回答