我有一个旧的Subversion存储库,里面有许多我的私人项目。其中一部分是几年前从旧的CVS存储库转换而来的(使用cvs2svn或类似工具)。它当前的结构如下:
- 主干
- latex
- java
- awt-doku
- pps
- build.xml
- src
- ant
- de
- dclj
- faq
- paul
- (约20个其他软件包)
- ltxdoclet
- (一些Java文件)
- lua
- (其他目录)
- 分支
- 标签
- 导入
我不想要这个仓库的其余部分(它们有时会成为单独的git仓库)- 这会使我的仓库变得太大(而且有些东西我不想公开)。
理想情况下,我的最终git仓库(在HEAD状态下)应该是这样的: pps - build.xml - src -- ant -- de --- dclj ---- paul ----- ltxdoclet ------ (一些java文件)
我并不关心历史目录配置,但是历史记录不应包含未触及这些目录(或它们的前身)中任何文件的提交。
当然,
git svn
似乎是最佳选择的工具。(还有其他吗?)
git svn clone
似乎是正确的命令...但是需要哪些选项呢?我创建了一个 authors.txt
文件来将 CVS 或 SVN 用户名转换为我的姓名和地址。为了只获取感兴趣的文件和目录,我使用了 --ignore-paths
。这是我的尝试:
filter='^/xcb-src/|_00|src/resources|dclj/faq|dclj/paul/([^l]|l[^t])'
git svn clone svn+ssh://mathe-svn/ --trunk trunk/java/pps -A authors.txt --ignore-paths=$filter latexdoclet
当然,它只显示提交2306之后的历史记录,当时我将
import/java-pps
移动到了trunk/java/pps
...而且它有很多提交根本没有任何更改。为解决第一个问题,我考虑同时给出旧目录作为
--trunk
参数:git svn clone svn+ssh://mathe-svn/ --trunk trunk/java/pps --trunk import/java-pps -A authors.txt --ignore-paths=$filter latexdoclet
这并不起作用,第一个
--trunk
在这里被忽略了,并且它在提交2305之前有效(在移动之前)。 (它还包含许多空提交。)我目前的尝试是导入整个存储库,过滤掉任何不需要的内容:
filter='/xcb-src/|_00|src/resources|dclj/faq|dclj/paul/([^l]|l[^t])|/esperanto|finanzen|diverses|homepage|konfig|lua|prog-aufgaben|CVSROOT|latex|tags/'
git svn clone svn+ssh://mathe-svn/ -A authors.txt --ignore-paths=$filter latexdoclet-neu
转换仍在进行中,但肯定有很多提交我根本不想要。
编辑:转换已完成 - 我现在有2658个提交(git中的3176个对象),只有大约36个提交具有一些有趣的树更改,如果我正确配置了我的gitk过滤器。(+还有3个被错误地过滤掉,因为我们的latex源文件首先在“latex”目录中。)
- 有没有更好的方法来做这件事情?
- 我是不是应该先导入整个代码库,然后使用
git filter-branch
挑选出我想要的文件和提交记录?
git rev-list --all | wc -l
计算提交的数量,但如果你删除了一些文件并压缩了空提交,你可能会有更少的提交数。 - Dustinfilter-branch
),我现在只剩下了我真正想要的40个提交。(我将在另一个答案中描述这个过程。) - Paŭlo Ebermann