59

我有一个项目git。有一天,我将所有项目文件从当前目录移动到foo/bar/项目下。我是用git mv. 然后我添加了更多文件并对现有文件进行了一些更改。

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

我试图以各种方式解决这个问题(filter-branch使用子目录过滤器等),但没有任何帮助,所以我在这里很累。我会很感激你能给我的任何帮助。谢谢!

4

3 回答 3

102

用移动的文件重写历史:

如果您希望项目的历史看起来好像所有文件都一直在目录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
于 2010-10-28T12:36:33.200 回答
7

在这里总结一下我所做的事情的简短摘要。对我有用的命令是:

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 的帮助。

于 2010-11-02T10:42:17.900 回答
1

安装 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
于 2021-03-03T13:48:03.270 回答