我想重命名/移动Git中的项目子树

/project/xyz

to

/components/xyz

如果我使用普通的gitmv项目组件,那么xyz项目的所有提交历史都会丢失。有没有一种方法可以移动它,以保持历史?


当前回答

git log --follow [file]

将通过重命名向您展示历史。

其他回答

首先,只需重命名即可创建独立提交。

然后,对文件内容的任何最终更改都将放在单独的提交中。

git log --follow [file]

将通过重命名向您展示历史。

我曾面临“重命名文件夹而不丢失历史记录”的问题。要修复此问题,请运行:

$ git mv oldfolder temp && git mv temp newfolder
$ git commit
$ git push

No.

简短的答案是否定的。在Git中重命名文件并记住历史是不可能的。这是一种痛苦。

有传言说,git log--follow--查找副本会更加困难,但这对我来说不起作用,即使文件内容没有任何更改,而且这些移动都是用git mv完成的。

(最初,我使用Eclipse在一次操作中重命名和更新包,这可能会混淆Git。但这是一件非常常见的事情。--如果只执行mv,然后提交mv,并且mv不太远,那么follow似乎确实有效。)

Linus表示,您应该全面了解软件项目的全部内容,而不需要跟踪单个文件。不幸的是,我的小脑袋无法做到这一点。

这么多人无意识地重复了Git自动跟踪移动的说法,这真的很烦人。他们浪费了我的时间。Git没有这样做。根据设计(!)Git根本不跟踪移动。

我的解决方案是将文件重命名回其原始位置。更改软件以适合源代码管理。使用Git,您似乎只需要第一次“获取”它。

不幸的是,这打破了Eclipse,它似乎使用了--follow。gitlog--follow有时不会显示具有复杂重命名历史的文件的完整历史记录,尽管gitlog会显示。(我不知道为什么。)

(有一些过于聪明的黑客会重新开始旧的工作,但它们相当可怕。请参阅GitHub Gist:emiller/git mv with history。)

简而言之:如果Subversion这样做是错误的,那么Git这样做也是错误的——这样做不是什么(错误!)功能,这是错误的。

Git检测重命名,而不是通过提交持久化操作,因此使用gitmv还是mv并不重要。

log命令采用--follow参数,该参数在重命名操作之前继续历史,即,它使用启发式搜索类似的内容。

要查找完整的历史记录,请使用以下命令:

git log --follow ./path/to/file