虽然在我的无知治愈后我可能会感到困惑,但这并不是我感到困惑,而是无知。这个问题涉及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将如何知道我的意思是特定的分支版本?
这甚至可能吗?或者我应该咬紧牙关并创建三个新目录?
答案 0 :(得分:3)
简单的答案是: Git没有处理模块化,Perl 。
你可以轻松地在Git中做你想做的事。但是,在我开始讨论如何做之前,我首先要解决你的例子:它很难用于分支。你应该保留你的代码。
您说您希望减少未来程序员的维护负担,但您已经通过将不同的格式化程序隔离到自己的文件中来实现这一点。程序员可以很好地处理这个问题。您的代码已经模块化。如果你使用分支进行模块化,一个项目很难输出两种格式!
此外,每个分支现在都有自己的主代码副本。必须在三个分支之间协调任何共同的变化。这是一个很大的麻烦。为了完成这项工作,您需要一个第四个分支,用于其他所有分支的公共代码。这是一项很多工作,没有任何好处。
总之,你做得很好。保持原样。
此外,作为Perl程序员,您应该编写模块。您可以在lib/PDF.pm
中使用PDF格式化程序对象,而不是PDF.pl中的函数库。 main函数创建适当的格式化程序,它们都具有相同的接口。这是一个很大的话题,对于这个答案来说太大了,我鼓励你提出一个问题。
回到你的问题。让我们假装将您的项目分成三个分支是个好主意。
首先要意识到的是Git分支只是指向提交的标签。现在,您的存储库看起来像这样,master
分支指向提交C。
A - B - C [master]
首先,为您的更改创建一个分支。 git branch pdf
。然后查看git checkout pdf
。现在,您的存储库看起来像这样,master
和pdf
都指向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
在一个命令中进行分支和签出。
现在你有四个分支的水..
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
分支(没有格式化程序)上,其他人都与之合并。我不打算尝试画画。
如果这个例子听起来过于复杂,那就是它!你不需要分支。