我如何重写历史记录,以便除已移动的文件之外的所有文件都位于子目录中?

我在git下有一个项目。 有一天,我将所有项目文件从当前目录移至项目下的foo/bar/ 。 我用git mv 。 然后我添加了一些文件,并对已有的文件进行了一些更改。

因此,现在当我查看foo/bar/file.c的历史记录时,我只能看到我在移动文件后所做的更改。

我试图以各种方式解决这个问题( filter-branch与子目录过滤器等),但没有什么帮助,所以我在这里相当堆叠。 我会感谢您能给我的任何帮助。 谢谢!


用移动的文件重写历史记录:

如果您希望项目的历史记录看起来好像所有文件一直位于foo/bar目录中,那么您需要做一些小小的手术。 使用git filter-branch和“tree filter”来重写提交,以便foo/bar不存在的任何地方创建它,并创建所有文件并将其移动到它:

git filter-branch --prune-empty --tree-filter '
if [ ! -e foo/bar ]; then
    mkdir -p foo/bar
    git ls-tree --name-only $GIT_COMMIT | xargs -I files mv files foo/bar
fi'

现在,历史将被记录下来,就像所有文件总是位于foo/bar

查看移动文件的历史记录:

如果您只想查看在过去的某个时间点移动或重命名的文件的历史记录,那么只需使用--follow选项来git log

git log --follow foo/bar/file.c

总结这里是对我所做的一个简短的总结。 为我工作的命令是:

if [ ! -e foo/bar ]; then mkdir -p foo/bar; git ls-tree --name-only $GIT_COMMIT | grep -v ^foo$ | xargs -I files mv files foo/bar || echo ""; fi

我在最后添加的echo命令确保即使mv失败,整个命令也会继续运行。 它没有移动foo / bar / foo的内容,但我可以忍受。

非常感谢Dan Molding(!!!)和Jefromi的帮助。

链接地址: http://www.djcxy.com/p/46971.html

上一篇: How can I rewrite history so that all files, except the ones I already moved, are in a subdirectory?

下一篇: git merge different repositories?