这是我刚刚解决类似问题的方法。我在一个准私有的“misc”仓库中开始了一个项目,重命名了一些文件,然后我想将该项目上传到GitHub上的https://github.com/kragen/aikidraw。
$ git clone misc aikidraw
$ cat > aikidraw-wanted
aikidraw.js
aikidraw.html
caposketchra.html
caposketchra.js
jquery-1.2.6.js
^D
$ cd aikidraw
$ git filter-branch --tree-filter 'bash -c "comm -23 <(/bin/ls | sort) <(sort ~/devel/aikidraw-wanted) | xargs rm -rf"' HEAD
目前看来这样做还可以,除了没有删除点文件(如.git
,是好的,和.gitignore
,是坏的),但显然我的Git版本(1.6.0.4)没有git filter-branch --prune-empty
。所以现在我克隆新的、更小的仓库(为了能更快地将其复制到网络上),并将代码库复制到另一台安装有Git 1.7.2.5的机器上:
$ time git clone aikidraw aikidraw-smaller
$ du -sh aikidraw/.git aikidraw-smaller/.git
8.6M aikidraw/.git
1.2M aikidraw-smaller/.git
$ time rsync -Pav aikidraw-smaller panacea.canonical.org:devel/aikidraw/
real 1m23.251s
然后在panacea.canonical.org上:
$ cd ~/devel/aikidraw/aikidraw-smaller
$ git checkout
$ git filter-branch --prune-empty HEAD
$ cd ../..
$ mv aikidraw i-hate-rsync
$ mv i-hate-rsync/aikidraw-smaller/ aikidraw
然后回到我的上网本:
$ mv aikidraw aikidraw-big
$ git clone panacea.canonical.org:devel/aikidraw
$ du -sh aikidraw/.git
268K aikidraw/.git
现在,如果您使用的是两个目录而不是五个文件,则此时您可能希望使用git mv
将剩余子目录中的所有内容重命名为存储库的根目录。在我的情况下,我已经完成了重命名。
$ git remote add github git@github.com:kragen/aikidraw.git
$ git push github master
希望这能帮到你!
git checkout
其中一个“早期历史”提交,那么git
会做什么?如果该文件曾经位于存储库现在的顶级目录之上,那么Git无法很好地处理它。 - Amber