GIT版本控制设置为多个项目共享代码



这些年来我使用过大约10个版本控制系统。我要用Git了,几天前我从来没用过。(Git通过SSH到"public" repo)

我问的不是如何使用Git,而是如何构建存储库,或者我是否需要多个存储库等等。我有多个项目引用多个库。我想给库贴上版本标签,这样我就可以很容易地维护:

A项目,2012年发货
主项目源代码,1.0版本,当前开发版本
Lib-A Version 1.0
Lib-B, Version 2.0
Lib-C,当前开发版本

项目B,即将发布,更新到1.0
主项目源代码,版本2.0,当前开发版本
Lib-A, Version 2.0,当前开发版本
Lib-B, Version 1.0
Lib-C,当前开发版本

这个想法是,我可以拉下到一个目录,我需要建立项目a和B的一切-与任何需求,他们可能有回到那时-使用当前的开发版本的能力,或留在旧版本(例如:Lib-B在项目B是一个旧版本,并没有被更新在这个时候,或者如果它是它将是一个分支。

最初,我在考虑类似于(In Repo):

/Src/项目
/Src/项目B
/Src/Lib/仙女镇李坝社区
/Src/Lib/LibB
/Src/Lib/LibC

在这种情况下,我必须将它们放入与存档中存在的结构不同的结构中,或者至少将它们放入不同的目录中,要么:

/Src/ProjectA/项目
/Src/ProjectA/仙女镇李坝社区
/Src/ProjectA/LibB
/Src/ProjectA/LibC


/Src/ProjectB/项目B
/Src/ProjectB/仙女镇李坝社区
/Src/ProjectB/LibB
/Src/ProjectB/LibC


/Src/ProjectA
/Src/ProjectB

/Src/Lib/仙女镇李坝社区
/Src/Lib/LibB
/Src/Lib/LibC

(对不起,格式不好,我真的很努力地说服这不是代码)

但是使用这种结构,当您从项目A切换到B的开发时,您需要切换Lib目录…这不是我想做的事。

在我看来,为了在GIT中做到这一点,我需要多个GIT repo,也许每个Lib一个

我最近被告知第一个选择,将多个版本放到不同的位置,将是一个坏主意。(他说的是在SVN下,所以可能不适用),我工作的公司几年前在Source Safe下做了这种事情,它工作得很好-我们能够创建一个文件,指定每个库的版本标签,并使用NANT脚本来获取正确的版本,并可以根据需要更新它们。(我不确定最简单的方法是什么,一开始,它会简单得多。可以做的另一件事是为发布的所有项目a的源代码应用一个标签,例如:"RELEASE_1_0_PROJECT_A",并根据该版本标签将所有源代码带下来。(标签或者你想叫它什么都行)

对于Source Safe,标签只在该位置及其下方,而不是在整个repo。

我还工作过一些地方,他们会分支代码并创建一个新的顶层树,例如:

/Dev/x64 Branch/ProjectA(结构的其余部分与第二个例子相同。

和/Dev/trunk/ProjectA(结构的其余部分与第二个例子相同)

在这种情况下,同时处理A和B,您将有两个项目所需的所有内容的分支,一个项目A分支和一个项目B分支。

建议吗?

感谢

更新:(本可以在下面的评论中这样做,但是StackOverflow溢出,不允许我发布那么长的评论)

好的,我照做了,最后得到:

 Project
     Libs
        LibA
        LibB
I created it with:
git add submodule ../Lib/LibA ./Libs/LibA
git update --init
Modified a file, and then tried to push it:
git push
warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:
  git config --global push.default matching
To squelch this message and adopt the new behavior now, use:
  git config --global push.default simple
See 'git help config' and search for 'push.default' for further information.
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
'current' instead of 'simple' if you sometimes use older versions of Git)
Counting objects: 7, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 378 bytes, done.
Total 4 (delta 3), reused 0 (delta 0)
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, **updating the current branch in a non-bare repository
remote: error: is denied,** because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To /src/C#/Lib/TraderhutLib
 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to...

注释:"默认情况下,在非裸存储库中更新当前分支是被拒绝的,因为它会使索引和工作树不一致…"

听起来我对某人的评论会哈哈大笑——基本上,它听起来像是在说:"你只能签入一个空的。git Repo,因为否则我们会弄乱你的工作目录,使之与你刚刚签入的不匹配。"

那么,我的新问题是:我如何签入更改?什么是简单/匹配的东西?我应该使用哪一个(看起来它给了我命令使它成为默认值)

谢谢。

听起来你想使用子模块。

您将有五个存储库:

    项目
  • 项目B
  • 自由
  • 自由B
  • 自由C

项目A将有三个子模块,每个库一个。项目B也将有三个子模块,每个库一个。

当您克隆一个项目时,您将确保使用--recursive,并且您也将以正确的版本签出所有库源(如果您愿意,不同的项目使用不同的版本)。当您更新库代码时,您将希望将更改提交到项目代码中,以便项目将使用新版本的库。

子模块通过在父项目中存储对子模块版本的SHA-1的引用来工作。所以Project A的1.0版本将参考Lib A的commit abc123...,对应于Lib A的1.0版本。当你签出Project A时,你会自动得到Lib A的1.0版本。

请花点时间动手学习git,例如Scott Chacon的"Pro git", Ben Lynn的"git magic",并在附近的git主页上链接各种教程/小抄。根据开发团队的规模,您还应该仔细阅读git工作流。尽早发现git能做什么和不能做什么,它和你所知道的系统有什么不同(就是的不同),哪些曾经只是白日梦或不可能复杂的事情在git中是微不足道的;在确定如何组织数据和工作流程之前,可以避免以后的许多挫折。

就像我学英语时被告知的:不要翻译,要学会用英语思考。当你做梦的时候你就完成了。是的,这需要时间。

最新更新