gpt4 book ai didi

git - git 如何处理模块化?

转载 作者:太空狗 更新时间:2023-10-29 14:45:02 25 4
gpt4 key购买 nike

不是我糊涂了,而是我糊涂了,虽然糊涂以后我可能糊涂了。这个问题涉及 git 如何处理模块化。

假设我正在自动化一个报告工具(我就是),并且我以 PDF 格式输出报告。我的目录结构只有一个文件,就是主模块,像这样:

main.pl

在 main.pl 中,我触发这样的输出:

print_output($ref_to_data);

一段时间后,其他用户想要报告自动化的好处,但他们需要以 Excel 和 HTML 格式输出。我通过添加输出模块来模块化我的代码,因此我的目录结构现在如下所示:

main.pl
main_v1.pl
PDF.pl
Excel.pl
HTML.pl

在 main_V1 代码中,我触发了这样的输出函数:

PDF::print_output($ref_to_data);
Excel::print_output($ref_to_data);
HTML::print_output($ref_to_data);

为此使用 git 进行版本控制不是问题。 Git 就像一个魅力。但是更多的时间过去了,现在我不得不把我的代码交给不同部门的其他人。这个应用现在推9 KLOC,我想重构来分离不同形式的输出。输出 PDF、Excel 和 HTML 的代码并不简单,我不想给维护人员增加不必要的负担。

我想创建三个分支,三个版本的 main,如下所示:

# PDF branch
main_V2.pl
PDF.pl

# Excel branch
main_V2.pl
Excel.pl

# HTML branch
main_V2.pl
HTML.pl

我可以通过创建三个新目录,将所有代码复制到其中,在每个目录中初始化一个 git 存储库,然后从那里开始。但是,我应该能够在同一个目录中创建三个分支。这样,当我在 PDF 分支中处理 main_V2.pl 时,它不会包含 Excel 或 HTML 代码,而当我在 Excel 分支中处理 main_V2.pl 时,它不会包含 PDF 或 HTML 代码.我的问题是,如果我在一个分支中启动 main_V2.pl,git 如何知道我指的是那个特定的分支版本?

这可能吗?还是我应该硬着头皮创建三个新目录?

最佳答案

简单的答案是:Git 不处理模块化,Perl 处理

您可以在 Git 中轻松地做您想做的事。但是,在介绍如何操作之前,我首先必须解决您的示例:这是对分支的错误使用。你应该保留你的代码。

你说你想减轻 future 程序员的维护负担,但你已经通过将不同的格式化程序隔离到它们自己的文件中来做到这一点。程序员可以很好地处理这个问题。您的代码已经模块化。如果通过分支进行模块化,一个项目将很难输出两种格式!

此外,每个分支现在都有自己的主要代码副本。任何共同的变化都必须在三个分支之间进行协调。这是一个主要的麻烦。要完成这项工作,您需要一个第四个 分支用于其他所有人分支的公共(public)代码。这是很多工作,而且没有任何好处。

总之,你做的很好。让它保持原样。


此外,作为 Perl 程序员,您应该编写模块。 lib/PDF.pm 中应该有一个 PDF 格式化程序对象,而不是 PDF.pl 中的函数库。主要功能创建适当的格式化程序,它们都具有相同的接口(interface)。这是一个很大的话题,对于这个答案来说太大了,我鼓励你提出一个关于它的问题。


回到你的问题。假设将您的项目分成三个分支是个好主意。

首先要意识到 Git 分支只是指向提交的标签。现在您的存储库看起来像这样,master 分支指向提交 C。

A - B - C [master]

首先,为您的更改创建一个分支。 git 分支 pdf。然后查看 git checkout pdf。现在您的存储库看起来像这样,masterpdf 都指向 C。

A - B - C [master]
[pdf]

现在使用 git rm Excel.pl HTML.pl 删除不需要的文件并使用 git commit 提交它们。瞧!您现在有一个只有 PDF 工作的分支。 master 安全地留在 C。

          D [pdf]
/
A - B - C [master]

对 HTML 和 Excel 重复上述操作。只要确保你从 master 分支它们!首先检查 master,然后检查分支。或者,您可以使用 git branch html master 明确指定分支点。您还可以使用 git checkout -b html 在一个命令中进行分支和 checkout 。

现在你有了这个由四个分支组成的九头蛇。

          D [pdf]
/
A - B - C - E [html]
[master]\
F [excel]

此时,不再需要master,应该将其删除。 git branch -d master.

          D [pdf]
/
A - B - C - E [html]
\
F [excel]

现在,如果您想处理 PDF 代码,请查看 pdf 分支。

然而,对 main.pl 的任何工作也是分支的。在 main.pl 上完成的任何工作都不会在分支之间共享。正如我之前提到的,这破坏了模块化的意义。你要么搞乱 git cherry-pick 要么有一个更复杂的分支结构,其中所有工作都发生在一个 common 分支(没有格式化程序)上,其他人 merge 和。我不会尝试绘制它。

如果这对于您的示例来说听起来过于复杂,那确实如此!您不需要分支。

关于git - git 如何处理模块化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33265746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com