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

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

我是git的新手,在决定清理代码结构后,现在面临git repo“内务处理”的挑战。我面临的挑战有两个方面:

  1. 需要将名称不太理想的REPO和一些SUBFOLDERS和FILES重命名为干净的python标准表示法(从使用破折号到带有下划线的短名称等)。

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

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

简而言之,我需要将测试代码分解为存储在新\ tests子文件夹中的新文件,然后通过重命名存储库来重命名代码文件夹。完成不使用git命令行?如果不是,我想是时候该学习它了,我很感谢指导以实现我上面所需要的内容,以使自己跳入水中,但不会被git命令行教程所困扰,即以最少的理论知识来实现​​我所需的更改。 / p>

非常感谢您分享智慧!

- 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 (f.e. __init__.py,context.py)

解决方法

您必须学习的最低理论部分是:Git没有文件历史。 Git有提交,并且提交是历史记录。每个提交都有一个每个文件的完整快照。 1

Git可以随时比较任何两个现有的提交。如果旧提交中有一个名为 F 的文件,而新提交中有一个名为 F 的文件,我们通常会假定这是同一文件。但是,假设旧提交的文件名为old/path/to/name1.py,新提交的文件名为new/name/of/name2.py 2 那么也许应该将它们视为“同一文件”,甚至尽管他们有不同的名字。

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

为了向您展示一个git log --follow -- path的“文件历史记录”,Git只是查看每个 commit 。 Git从末尾开始并向后工作(它总是这样做),将启用前后的快照进行比较,并启用重命名检测。如果 path 在“之后”提交中,并且Git发现它是从“之前”提交中的某些上一个路径重命名的,Git会告诉您,然后开始寻找 old 路径名。

基本上就是您所能得到的。重命名文件或重组项目时,最好的选择是提交 just 重命名,作为一次提交,然后再提交其他所需的更改。您不必执行 操作,因为重命名检测器通常可以检测到已重命名的已重命名的且已更改的文件,但是当您执行重命名检测时,可以得到更好的重命名检测保证分别提交重命名,以便每个文件与上一个文件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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?