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

使用共享代码为多个项目设置GIT版本控制,git,version-control,Git,Version Control,多年来,我使用了大约10个版本控制系统。我正转向Git,几天前我从未使用过它。(通过SSH将Git转换为“公共”回购协议) 我不是问如何使用Git,而是问如何构造存储库,或者我是否需要多个存储库或什么。我有多个引用多个库的项目。我希望为库添加版本标签,这样我就可以很容易地维护如下内容: 项目A,2012年发货 主要项目来源,版本1.0,当前开发版本 Lib-A,1.0版 Lib-B,版本2.0 Lib-C,当前开发版本 项目B即将发布,更新为1.0 主要项目来源,版本2.0,当前开发版本 Lib

多年来,我使用了大约10个版本控制系统。我正转向Git,几天前我从未使用过它。(通过SSH将Git转换为“公共”回购协议)

我不是问如何使用Git,而是问如何构造存储库,或者我是否需要多个存储库或什么。我有多个引用多个库的项目。我希望为库添加版本标签,这样我就可以很容易地维护如下内容:

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

项目B即将发布,更新为1.0
主要项目来源,版本2.0,当前开发版本
Lib-A,版本2.0,当前开发版本
Lib-B,1.0版
Lib-C,当前开发版本

我的想法是,我可以把构建项目a和B所需的所有东西都放到一个目录中——不管它们当时有什么要求——能够使用当前的开发版本,或者使用旧版本(例如:项目B中的Lib-B是较旧的版本,此时不会更新,如果是,则将是一个分支。)

最初,我想的是(回购协议):

/Src/项目A
/Src/项目B
/Src/Lib/LibA
/Src/Lib/LibB
/Src/Lib/LibC

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

/Src/项目A/项目A
/Src/ProjectA/LibA
/Src/ProjectA/LibB
/Src/ProjectA/LibC


/Src/项目B/项目B
/Src/ProjectB/LibA
/Src/ProjectB/LibB
/Src/ProjectB/LibC


/Src/ProjectA
/Src/ProjectB

/Src/Lib/LibA
/Src/Lib/LibB
/Src/Lib/LibC

(很抱歉格式不好,我很努力地说服这不是代码)

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

在我看来,为了在GIT中实现这一点,我需要多个GIT回购,可能每个库一个

最近有人告诉我,第一种选择是将多个版本带到不同的位置,这是个坏主意。(他说的是SVN,所以可能不适用),我工作的那家公司几年前在源代码安全环境下做了这类事情,它运行得非常好-我们能够创建一个文件,指定每个库的版本标签,并使用NANT脚本获取正确的版本,并可以根据需要进行更新。(不确定最简单的方法是什么,一开始,它会简单得多。就像一个文件说它需要什么版本或什么)另一个可以做的事情是在所有项目a的源代码中为发布应用一个标签,比如:“发布1\u 0\u项目\u a”并根据该版本标签关闭所有源代码。(标记或任何您希望的名称)

然而,在Source Safe的情况下,标签仅在该位置及其下方,而不是整个回购协议

我也曾在一些地方工作过,在那里他们可以分支代码并创建一个新的顶级树,例如:

/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,否则我们会弄乱你的工作目录,使之与你刚刚签入的内容不匹配。”

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


谢谢。

听起来您想使用子模块

您将有五个存储库:

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

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


子模块通过在父项目中存储对子模块版本SHA-1的引用来工作。因此,项目a的1.0版将引用Lib a的commit
abc123…
,它对应于Lib a的1.0版。当您签出项目a时,您将自动获得Lib a的1.0版。

请花点时间动手使用git,学习Scott Chacon's、Ben Lynn's等,并在附近链接各种教程/备忘单。根据开发组的范围,您还应该阅读git工作流。尽早了解git可以做什么和不能做什么,它与