我想重命名/移动Git中的项目子树
/project/xyz
to
/components/xyz
如果我使用普通的gitmv项目组件,那么xyz项目的所有提交历史都会丢失。有没有一种方法可以移动它,以保持历史?
我想重命名/移动Git中的项目子树
/project/xyz
to
/components/xyz
如果我使用普通的gitmv项目组件,那么xyz项目的所有提交历史都会丢失。有没有一种方法可以移动它,以保持历史?
当前回答
我曾面临“重命名文件夹而不丢失历史记录”的问题。要修复此问题,请运行:
$ git mv oldfolder temp && git mv temp newfolder
$ git commit
$ git push
其他回答
git log --follow [file]
将通过重命名向您展示历史。
Git检测重命名,而不是通过提交持久化操作,因此使用gitmv还是mv并不重要。
log命令采用--follow参数,该参数在重命名操作之前继续历史,即,它使用启发式搜索类似的内容。
要查找完整的历史记录,请使用以下命令:
git log --follow ./path/to/file
我遵循这个多步骤过程将代码移动到父目录并保留历史记录。
步骤0:从“master”创建了分支“history”以进行安全保管
步骤1:使用gitfilter repo工具重写历史。下面的命令将文件夹“FolderwithContentOfInterest”移动到一个级别,并修改了相关的提交历史记录
git filter-repo --path-rename ParentFolder/FolderwithContentOfInterest/:FolderwithContentOfInterest/ --force
步骤2:此时GitHub存储库丢失了远程存储库路径。添加远程引用
git remote add origin git@github.com:MyCompany/MyRepo.git
步骤3:从存储库中提取信息
git pull
步骤4:将本地丢失分支连接到源分支
git branch --set-upstream-to=origin/history history
步骤5:如果提示,解决文件夹结构的合并冲突
第6步:推!!
git push
注意:修改的历史记录和移动的文件夹似乎已提交。在此处输入代码
完成。代码移动到父目录/所需目录,保持历史记录完整!
首先,只需重命名即可创建独立提交。
然后,对文件内容的任何最终更改都将放在单独的提交中。
要重命名目录或文件(我不太了解复杂的情况,因此可能需要注意):
git filter-repo --path-rename OLD_NAME:NEW_NAME
要在提到目录的文件中重命名目录(可以使用回调,但我不知道如何):
git filter-repo --replace-text expressions.txt
expressions.txt是一个充满了文字:OLD_NAME==>NEW_NAME等行的文件(可以将Python的RE与regex一起使用,也可以将glob与glob一起使用)。
要重命名提交消息中的目录,请执行以下操作:
git-filter-repo --message-callback 'return message.replace(b"OLD_NAME", b"NEW_NAME")'
Python的正则表达式也受支持,但必须用Python手动编写。
如果存储库是原始的,没有远程,则必须添加--force以强制重写。(在执行此操作之前,您可能需要创建存储库的备份。)
如果不想保留引用(它们将显示在GitGUI的分支历史记录中),则必须添加--replace-refs delete no add。