将git存储库上移一个层次结构级别

Git初学者问题:

我有一个小型的私人web项目,这是与msysgit本地版本。 没有外部存储库,因为它只对我来说,所以我可以bascially做任何我想要的。

我有这个设置在项目目录,即在“webroot”。

现在必须创build第二个目录,放置在与webroot平行的位置。 我们称之为资产。

所以结构如下:

\ project directory ----\webroot ----\assets 

我很想把这个新的目录包含在git仓库中,这样我也可以更改存储在那里的文件,但是当然我不能使用“git add ../assets”。 我也不想在project_directory中创build一个新的git项目,因为这会丢失我以前的所有提交。

那么我怎样才能把资源库从“webroot”移到“project_directory”,同时保留我的提交,然后能够包含“资产”?

所以,你想要你的git仓库看起来像这样:

 <projectdir> /.git /webroot /assets 

为此,您必须将存储库中的现有文件移动到新的webroot子目录中。

 cd <git repo root> mkdir webroot git mv <all your files> webroot git commit --all -m "moved all existing files to new 'webroot' directory" 

然后,在您的本地文件系统上,您要将您的克隆一个目录重新定位到现在的位置:

 cd <projectdir> mv webroot/* . rmdir webroot 

然后你想添加assets目录(和文件)到git仓库:

 git add assets git commit -m "added assets to the repo" 

我假设你打算重写历史logging,以包含所有修订版本中的所有文件, 就好像它们总是在子目录webroot /而不是在根目录

git filter-branch manpage有答案,这里是一个改进的版本,重写所有现有的裁判(分支)和标签:

 time git filter-branch --index-filter 'git ls-files -s | sed "s-\t\"*-&webroot/-" | GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' --tag-name-filter cat -- --all 

已经采取谨慎的做法,使其成为仅索引操作,以便即使进行大量回购,该过程也可以快速运行。 记住(当满意的时候)摆脱原始的参考(.git / refs / original / *),并重新包装回购以释放过时的树对象。

你也可以将你的.git目录上移一层,并更新你的工作树。

 cd projectdir mv ./webroot/.git ./.git git config core.worktree /absolute-path-to-project-dir git add assets git commit -m 'adding assets folder' 

不是肯定的,但我很确定core.worktree的path必须是绝对的。

你的提交不在本地绑定到他们存储在git仓库中的“webroot”文件夹。

你可以简单地删除webroot目录,重新检查仓库在新位置“/ project directory”添加assets目录并提交。

 rm -Rf webroot git clone path-to-repo git add assets git commit -m "Added assets directory" git push