如何做 git-svn fetch 并保留空目录?
How to do git-svn fetch and retain empty directory?
我创建了一个简单的脚本来迁移相当大的 SVN 存储库。我没有使用 git svn clone
,而是使用 git svn init
和 git svn fetch
,这样我就可以指定修订版并逐块获取它。大致是这样的:
while [ "$CURRENT_REVISION" -lt "$MAX_REVISION" ]; do
END_REVISION=$((CURRENT_REVISION + 100))
if [ "$END_REVISION" -ge "$MAX_REVISION" ]
then
END_REVISION=$MAX_REVISION
fi
git svn fetch -r "$CURRENT_REVISION":"$END_REVISION" --authors-file="$AUTHORS_FILE"
#increasing the current and end revision
CURRENT_REVISION=$END_REVISION
END_REVISION=$((CURRENT_REVISION + 100))
done
不过,据我所知,默认情况下 fetch/clone 的行为不会保留空目录。因此,我可能需要手动检查那些空目录(*我试图避免)。
git svn clone
中有一个 --preserve-empty-dirs
参数,但 git svn fetch
中没有。
是否有任何解决方法来解决这个问题?
更新
虽然官方文档中没有提到我们可以使用config key来fetch,但实际上是可以的
@Vampire对这个问题有详细的解释。所以我会简化这个。
完成初始化存储库后,我不得不更改远程分支的配置:
git config svn-remote.<remote name>.preserve-empty-dirs "true"
git config svn-remote.<remote name>.placeholder-filename ".gitkeep"
您可以通过查看 /.git/config 来验证配置。只需正常获取,您的目录将被保留。
git-svn
不是 一次性转换存储库的正确工具。如果您想使用 Git 作为现有 SVN 服务器的前端,这是一个很好的工具,但是对于一次性转换,您应该 而不是 使用 git-svn
,但是svn2git
更适合这个用例。
有很多名为 svn2git
的工具,最好的可能是来自 https://github.com/svn-all-fast-export/svn2git 的 KDE。我强烈建议使用 svn2git
工具。它是我所知道的最好的,而且你可以非常灵活地使用它的规则文件。
如果您不是 100% 了解存储库的历史,http://blog.hartwork.org/?p=763 中的 svneverever
是一个很好的工具,可以在将 SVN 存储库迁移到 Git 时调查其历史.
如果您仍想使用 git svn
,则无需手动阻止您的抓取。只要做git svn clone ...
,如果你想暂停,取消执行然后做git svn fetch
继续抓取过程。它会在停止工作的地方自动继续,甚至会验证上次获取的修订是否已完全获取或需要重新获取。
如果您仍想手动抓取数据,请注意 git svn clone ...
与 git svn init ...
后接 git svn fetch
完全相同,但根据 clone
特定参数配置属性 svn-remote.<remote name>.preserve-empty-dirs
设置为 true
,svn-remote.<remote name>.placeholder-filename
设置为您在 init
和 fetch
之间提供的参数。因此,只需在初始化之后和获取之前手动执行此操作就可以了。
请注意: preserve-empty-dirs
仅当您需要在 Git 存储库中拥有这些空目录并且您仅使用Git 之后的存储库。只要您只使用 git svn
作为现有 SVN 存储库的前端,emtpy 目录应该会自动在您的工作区中创建,并且不需要是实际存储库历史记录的一部分。 preserve-empty-dirs
所做的是向提交添加一个空的 .gitignore
文件(或您使用其他参数/配置 属性 配置的任何内容),这样该文件夹就不再是空的了。这样做是因为 Git 是内容跟踪器,而不是文件系统跟踪器。它跟踪恰好存储在文件中的源代码,而不是文件和文件夹本身。这也是为什么在 Git 中没有显式 move
或 copy
操作这样的东西的原因,因为移动和复制是在必要和需要的地方即时确定的。从技术上讲,它只是 remove
和 add
for move
或简单的 add
for copy
.
我创建了一个简单的脚本来迁移相当大的 SVN 存储库。我没有使用 git svn clone
,而是使用 git svn init
和 git svn fetch
,这样我就可以指定修订版并逐块获取它。大致是这样的:
while [ "$CURRENT_REVISION" -lt "$MAX_REVISION" ]; do
END_REVISION=$((CURRENT_REVISION + 100))
if [ "$END_REVISION" -ge "$MAX_REVISION" ]
then
END_REVISION=$MAX_REVISION
fi
git svn fetch -r "$CURRENT_REVISION":"$END_REVISION" --authors-file="$AUTHORS_FILE"
#increasing the current and end revision
CURRENT_REVISION=$END_REVISION
END_REVISION=$((CURRENT_REVISION + 100))
done
不过,据我所知,默认情况下 fetch/clone 的行为不会保留空目录。因此,我可能需要手动检查那些空目录(*我试图避免)。
git svn clone
中有一个 --preserve-empty-dirs
参数,但 git svn fetch
中没有。
是否有任何解决方法来解决这个问题?
更新
虽然官方文档中没有提到我们可以使用config key来fetch,但实际上是可以的
@Vampire对这个问题有详细的解释。所以我会简化这个。
完成初始化存储库后,我不得不更改远程分支的配置:
git config svn-remote.<remote name>.preserve-empty-dirs "true"
git config svn-remote.<remote name>.placeholder-filename ".gitkeep"
您可以通过查看 /.git/config 来验证配置。只需正常获取,您的目录将被保留。
git-svn
不是 一次性转换存储库的正确工具。如果您想使用 Git 作为现有 SVN 服务器的前端,这是一个很好的工具,但是对于一次性转换,您应该 而不是 使用 git-svn
,但是svn2git
更适合这个用例。
有很多名为 svn2git
的工具,最好的可能是来自 https://github.com/svn-all-fast-export/svn2git 的 KDE。我强烈建议使用 svn2git
工具。它是我所知道的最好的,而且你可以非常灵活地使用它的规则文件。
如果您不是 100% 了解存储库的历史,http://blog.hartwork.org/?p=763 中的 svneverever
是一个很好的工具,可以在将 SVN 存储库迁移到 Git 时调查其历史.
如果您仍想使用 git svn
,则无需手动阻止您的抓取。只要做git svn clone ...
,如果你想暂停,取消执行然后做git svn fetch
继续抓取过程。它会在停止工作的地方自动继续,甚至会验证上次获取的修订是否已完全获取或需要重新获取。
如果您仍想手动抓取数据,请注意 git svn clone ...
与 git svn init ...
后接 git svn fetch
完全相同,但根据 clone
特定参数配置属性 svn-remote.<remote name>.preserve-empty-dirs
设置为 true
,svn-remote.<remote name>.placeholder-filename
设置为您在 init
和 fetch
之间提供的参数。因此,只需在初始化之后和获取之前手动执行此操作就可以了。
请注意: preserve-empty-dirs
仅当您需要在 Git 存储库中拥有这些空目录并且您仅使用Git 之后的存储库。只要您只使用 git svn
作为现有 SVN 存储库的前端,emtpy 目录应该会自动在您的工作区中创建,并且不需要是实际存储库历史记录的一部分。 preserve-empty-dirs
所做的是向提交添加一个空的 .gitignore
文件(或您使用其他参数/配置 属性 配置的任何内容),这样该文件夹就不再是空的了。这样做是因为 Git 是内容跟踪器,而不是文件系统跟踪器。它跟踪恰好存储在文件中的源代码,而不是文件和文件夹本身。这也是为什么在 Git 中没有显式 move
或 copy
操作这样的东西的原因,因为移动和复制是在必要和需要的地方即时确定的。从技术上讲,它只是 remove
和 add
for move
或简单的 add
for copy
.