我有一个项目git
。有一天,我将所有项目文件从当前目录移动到foo/bar/
项目下。我是用git mv
. 然后我添加了更多文件并对现有文件进行了一些更改。
结果,现在当我查看 的历史记录时foo/bar/file.c
,我只能看到我在移动文件后所做的更改。
我试图以各种方式解决这个问题(filter-branch
使用子目录过滤器等),但没有任何帮助,所以我在这里很累。我会很感激你能给我的任何帮助。谢谢!
我有一个项目git
。有一天,我将所有项目文件从当前目录移动到foo/bar/
项目下。我是用git mv
. 然后我添加了更多文件并对现有文件进行了一些更改。
结果,现在当我查看 的历史记录时foo/bar/file.c
,我只能看到我在移动文件后所做的更改。
我试图以各种方式解决这个问题(filter-branch
使用子目录过滤器等),但没有任何帮助,所以我在这里很累。我会很感激你能给我的任何帮助。谢谢!
用移动的文件重写历史:
如果您希望项目的历史看起来好像所有文件都一直在目录foo/bar
中,那么您需要做一些小手术。与“树过滤器”一起使用git filter-branch
来重写提交,以便任何地方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 的帮助。
安装 git-filter-repo:
git clone https://github.com/newren/git-filter-repo/
将 git-filter-repo 可执行文件添加到您的 $PATH(有关其他选项,请参阅INSTALL.MD ):
# this is just an example, you probably want to edit bashrc,
# or add a symlink to ~/bin or /usr/local/bin
PATH=$PATH:${PWD}/git-filter-repo
现在cd
到要修改的 git 存储库,然后运行:
git filter-repo --to-subdirectory-filter foo/bar