繁体   English   中英

如何在保留历史记录的同时拆分和重命名git中的代码文件?

[英]How to split out and rename code files in git while preserving history?

我是 git 的新手,现在在决定清理代码结构后面临着 git repo 'housekeeping' 挑战。 我的挑战有两个方面:

  1. 需要将标题不太理想的 REPO 和一些子文件夹和文件重命名为干净的 Python 标准符号(从使用破折号到带下划线的较短名称等)。

  2. 将测试代码拆分为保存在专用 \\tests 文件夹中的 .py 文件。

我发现在 git 中清理上述代码和文件结构很难保留更改历史记录。 关于该主题的其他答案似乎涵盖了这项工作的一部分。 我尝试通过 git online 重命名文件,但是,虽然正式保留了历史记录,但它仅存储已移至 \\test 文件夹的大块测试代码的批量删除行为。 新创建的 \\tests\\basic_test.py 和 \\tests\\advanced_test.py 文件显然被 git 视为新文件,即之前的更改历史为零。

简而言之,我需要将测试代码拆分为存储在新 \\tests 子文件夹中的新文件,然后通过重命名 repo 来重命名根代码文件夹。 这是否可以在不使用 git 命令行的情况下完成? 如果不是,我想现在是我学习它的时候了,我很欣赏指导,以实现我在上面跳入水中所需的内容,但不会陷入 git 命令行教程的泥潭,即以最少的理论知识实现我需要的更改。

非常感谢分享智慧!

 - mt code structure 1.0 \\money-tracker # local dir and git repo name money_tracker_v01_9.4 - mt code structure 2.0 \\money_tracker # app root_dir (local dir and git repo name) \\mt # code_dir (shared code base named after main mod) mt.py \\tests test_basic.py test_advanced.py \\data_in (private, local) coa.csv trxn_data_x.csv \\data_out (private, local) cf_report_x.txt * each mt_dir may contain aux files (fe __init__.py, context.py)

最小的理论部分,你必须学会的是:Git不会文件历史记录。 Git 有提交,提交就是历史。 每个提交都有每个文件的完整快照。 1

Git 可以随时比较任何两个现有的提交。 如果旧提交中有一个名为F的文件,而新提交中有一个名为F的文件,我们通常假设这是同一个文件 但是假设旧提交有一个名为old/path/to/name1.py的文件,而新提交有一个名为new/name/of/name2.py 2那么也许那些应该被认为是“同一个文件”,即使它们有不同的名称。

如果某个提交重命名了某个文件,Git 可以尝试检测该重命名。 此重命名检测取决于文件在内容方面是否足够相似。 内容 100% 匹配保证 Git 可以很容易地找到重命名。 所以当你有一个重命名文件的提交时,告诉 Git告诉我在这个提交中发生了什么变化,顺便说一句,在你这样做时检测重命名3将使 Git 将“之前”快照与“之后”进行比较一个”,它会找到所有的重命名。

为了向您展示一个假装“文件历史”与git log --follow -- path ,Git会简单地查看每个提交 Git 从最后开始向后工作(它总是这样做),比较前后快照,并启用重命名检测。 如果path在“after”提交中,并且 Git 发现它是从“before”提交中的某个先前路径重命名的,则 Git 会告诉您这一点,然后开始查找路径名。

这基本上就是你所得到的。 因此,在重命名文件或重组项目时,最好的选择是提交重命名,作为一次提交,然后提交所需的任何其他更改。 没有做到这一点,因为重命名探测器可以经常检测renamed-和更改的文件重命名,但你得到一个更好的重命名检测保证,当你有重命名单独提交,因此每个文件100% -匹配上一个。

请注意,是否有任何特定的 GUI 开启重命名检测,如果是,如何,取决于该 GUI。 Git提供的所有内容都是提交。


1提交中的文件以特殊的、只读的、仅限 Git 的、压缩和重复数据删除的格式存储。 这意味着,如果您连续进行一千次提交,并且只更改README.md一次,那么您将拥有旧版本的 998 个共享副本和新版本的 2 个共享副本,或者旧版本的 400 个共享副本以及新版本的 600 个共享副本,因此无论哪种方式,它实际上只存储库中两次,而不是一千次。

然而,这也意味着当您使用 Git 存储库时,您看到和处理的文件不在 Git 存储库中 您看到和使用的文件是存储库中提取的副本,并在此过程中变回可用文件。 这很好地解释了为什么 Git 的行为方式如此。

2请注意,斜杠(尽管您可以在 Windows 上使用反斜杠)是每个文件名的一部分:例如,名称是old/path/to/name1.py 这不是一个名为old的文件夹,其中包含一个名为path的文件夹等等,这只是一个名为old/path/to/name1.py

3在命令行中,使用git diff --find-renamesgit show --find-renames启用重命名检测器,或将diff.renames设置为true 在 Git 2.9 及更高版本中, diff.renames默认设置为true 在早期版本中,它默认设置为false

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM