你是对单个应用程序版本控制还是整个项目还是两者都进行版本控制?

7

好的,我有一个Django项目。 我想知道是否应该将每个应用程序放入其自己的git存储库中,还是最好只将整个项目放入git存储库中,或者是否我应该为每个应用程序和项目都有一个git存储库?

谢谢。

6个回答

4

这真的取决于那些可重用应用程序是否会在项目之外被重复使用?

你可能需要将它放在不同的存储库中,只有当其他具有单独存储库的项目需要使用它时才需要。但是您可以随时将其拆分。创建git存储库很便宜,因此如果有必要,可以稍后再做。从一开始就让事情变得复杂只会让您以后感到沮丧,所以请随时等待直到您知道它是必要的。

YAGNI不仅适用于代码。


现在请将应用程序保留在一个仓库中,特别是如果您只有一个项目。只要您保持应用程序小而专注,通常很容易将它们概括到足以与另一个项目一起使用。正如Jeremy所说,除非您需要它,否则这种努力并不值得。 - jds

4

我喜欢汤姆亚历克斯的回答,但它们缺乏真正的理论依据
(“每个开发团队只有一个存储库”更容易?
“很多人可能对分离的应用程序进行拉取(或查看更改)”
为什么?)

首先,一个或多个仓库是一个服务器端管理的决策(涉及服务器资源)。SVN很容易在一个服务器后面设置多个仓库,而ClearCase将为每个VOB拥有自己的“vob_server”进程,这意味着:您不希望在一个Unix服务器上拥有超过一百个VOB(或在Windows服务器上超过20-30个)。Git是特殊的:设置一个仓库很便宜,访问它可以很容易(通过一个简单的共享路径),也可以涉及一个过程(一个git守护进程)。最新的解决方案意味着:“不要直接从外部访问太多的仓库”。(它们可以通过由超级项目引用的子模块间接访问)

接下来是客户端管理:当涉及一个或多个仓库时,工作空间的配置将有多么复杂。客户端如何引用正确的配置?(需要引用正确文件的标签列表)。

SVN使用外部引用,Git使用“子模块”,在这两种情况下都会增加复杂性。

这就是为什么汤姆的答案可能是正确的原因。

最后,还有配置管理方面(在Alex的回答中提到)。你能标记部分仓库吗?
如果可以(就像在SVN中,你实际上可以复制部分仓库),那么你就可以采用组件方法,其中几组文件有自己的生命周期和自己的标签(以自己的个体节奏设置)。
但是在Git中,这是不可能的:标签引用的是涉及整个存储库的提交。
这意味着采用"基于系统"的方法,无论如何你都只需要整个项目(与Alex的回答中的“观察单独的应用程序-我从未在现实生活中观察到”相反)。如果是这种情况(如果你无论如何都需要整个系统),那就不重要了。

但对于那些按独立文件组思考的人来说,这意味着git存储库实际上代表了一个单独的文件组(具有自己的演变和标记节奏),可能会有一个超级项目将这些存储库作为子模块引用。
这不是你每天都会遇到的设置,因此对于独立项目,我建议只使用少量或一个Git存储库。
但对于更复杂的相互依赖的项目集...您需要意识到Git的设计方式,“存储库”表示一组一致的文件,应该与所有文件以相同的速度演变。并且如果“所有内容”足够复杂,则不一定能够全部适合一组文件中。因此,在这种情况下需要多个存储库。
在现实生活中也会发生复杂的相互依赖的项目集;)


2
几乎总是更容易为每个开发团队设置一个代码库,无论你拥有多少产品。最终,您将希望在项目之间共享代码(甚至是几个独立的DJango网站!),而只有一个代码库会更容易实现。
请务必在该代码库内设置良好的文件夹结构。然而,从git中进行单个检出(可能是从子文件夹中)应该为您的测试网站提供所需的所有文件(Python,模板,CSS,JPG等),然后您只需复制httpd.conf等即可完成安装。

1
如果您有可重复利用的应用程序,请将它们放在单独的存储库中。如果您担心私有存储库的数量,请查看Bitbucket(如果您决定将其开源,我建议使用github)。有一种很好的方式可以将您自己的应用程序包含到项目中,甚至可以使用版本标签:我最近发现了一种使用buildout和git标签来实现此目的的方法(我以前使用svn:externals包含应用程序,但最近从svn切换到了git)。我首先尝试了mr.developer,但是由于无法使其工作,我找到了一个替代方案:我发现gp.vcsdevelop非常易于用于此目的。请参见 https://pypi.python.org/pypi/gp.vcsdevelop。最终,我将其放入我的buildout文件中,并立即让它正常工作(我必须向我的应用程序添加pip requirements.txt才能让它正常工作,但这毕竟是一件好事)。
vcs-update = True
extensions =
    gp.vcsdevelop
    buildout-versions
develop-dir=./local_checkouts

vcs-extend-develop=git+git@bitbucket.org:<my bitbucket username>/<the  app I want to include>.git@0.1.38#egg=<the appname in django>

develop = .

在这种情况下,它检查我的应用程序并将其克隆到版本标记0.1.38中,放置在子目录./local_checkouts/的项目中,并在运行bin/buildout时进行开发。
编辑:备注2013年8月26日
在使用此解决方案并在项目中使用的应用程序的本地检出中进行编辑时,我发现了以下内容:
当尝试正常的“git push origin master”命令时,您将收到此警告:
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again.  See the 'Note about
fast-forwards' section of 'git push --help' for details.

2013年8月28日编辑

关于在gp.vcsdevelop包含的共享应用程序的local_checkouts中工作:

(并处理上面讨论的警告)

git push origin +master似乎会损坏共享代码的提交历史记录

因此,在local_checkout目录中工作的方法如下:

进入本地checkout(经过bin/buildout后,checkout是主要的):

cd localcheckouts/<shared appname>

创建一个新分支并切换到它,如下所示:

git checkout -b 'issue_nr1'(例如,分支的名称以您正在处理的问题命名)

在完成此分支中的工作后,请使用以下命令:(在通常的git add和git commit之后)
git push origin issue_nr1

当测试并完成分支后,将其合并回主分支:
首先检出主分支:
git checkout master

更新(可能仅需要在此期间进行其他提交)

git pull

并合并到主分支(您现在所在的位置):
git merge issue_nr1

最后推送此合并:
git push origin master

感谢这篇简化版的git指南http://rogerdudler.github.io/git-guide/,之后你可能需要清理分支,可以删除这个分支。

git branch -d issue_nr1

1

我不是git专家,但我认为适当的策略与hg或者在这种情况下甚至svn的策略没有任何区别,所以我还是要发表我的意见。

每个应用程序一个仓库只有在大量人员可能对单独的应用程序进行拉取(或观察更改)时才有意义;理论上可能会出现这种情况,但我从未在现实生活中观察到过——大多数对项目感兴趣的人都是对整个项目感兴趣。因此,我建议避免复杂性,将整个项目制作成一个仓库。


Alex,我问这个问题的原因是Django似乎强调可重用应用程序的概念。我对你的说法“理论上可能是这样,但我从未在现实生活中观察到过”感到好奇。你会说Django中可重用应用程序的想法更多地是一种“理论上不错”的东西吗? - rick
@rick,要么你是对的,这只是“理论上很好”,要么我就是缺乏足够的实际Django经验——毕竟,对我来说,Django只是我箭袋中众多(好的和受欢迎的!)箭之一,而不是我开发应用程序的唯一方式!-) - Alex Martelli

1

这些单独的应用程序是否使用共享代码和库?如果是,它们确实属于同一个存储库...这使您能够在运行单个测试套件时查看新更改的影响。

如果它们完全分离且不可知,那么实际上并不重要。仅出于清晰起见、易于构建和打包的考虑,我更喜欢将整个项目放在一个组合存储库中。然而,我们通常是在非常小的团队中工作。因此,如果没有共享代码涉及,则真正的问题只是哪种方法对所有相关人员最方便和高效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接