假设我有一个包含以下目录结构的代码仓库:
repo/
blog/
_posts/
some-post.html
another-file.txt
我想将_posts
移动到仓库的顶层,使结构看起来像这样:
repo/
_posts/
some-post.html
another-file.txt
使用 git mv
很容易实现,但我想让历史记录看起来好像 _posts
一直存在于仓库的根目录中,并且我希望能够通过 git log -- _posts/some-post.html
获得 some-post.html
的完整历史记录。我认为可以使用 git filter-branch
进行一些魔法来实现这一点,但我还没有弄清楚具体如何操作。有什么想法吗?
--index-filter
更快,因为它不需要检出树形结构。 - Cascabelgit rm --cached
而不是rm
)。 - sehegit filter-branch --index-filter 'git read-tree --prefix=/ $GIT_COMMIT:_posts; git rm -r --cached _posts' -- --all
。 - jthillgit push --force --all
命令。否则你可能会遇到一些有趣的情况。 - SiliconMindgit filter-branch --tree-filter 'git mv -k blog/_posts .'
在这种情况下,索引过滤器将不起作用,因为您还修改了树对象(并且需要将它们签出),而不仅仅是索引。-k
开关将处理某些提交中的“不存在”文件。 - petrpulc