问题描述
我是git的新手,在决定清理代码结构后,现在面临git repo“内务处理”的挑战。我面临的挑战有两个方面:
我发现在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-renames
或git show --find-renames
启用重命名检测器,或将diff.renames
设置为true
。在Git 2.9和更高版本中,默认情况下diff.renames
设置为true
;在早期版本中,默认情况下将其设置为false
。