这是我刚刚解决了类似问题的方法。我在一个准私有的“misc”存储库中启动了一个项目,重命名了一些文件,然后我想在https://github.com/kragen/aikidraw将项目上传到 GitHub 。
$ 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
. 所以现在我克隆新的、更小的 repo(以便更快地通过网络复制它)并将 repo 复制到另一台装有 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 # Oops. I hate rsync sometimes.
$ git checkout # otherwise I get "Cannot rewrite branch(es) with a dirty working directory."
$ 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
希望这可以帮助!