多年来我使用了大约10个版本控制系统。我正在转向Git,几天前我从未使用过它。 (通过SSH获取“公共”回购)
我不是在问如何使用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是旧版本,此时不会更新,或者如果它是分支。)
最初,我在思考(In Repo)的内容:
/ Src /项目A
/ Src /项目B
/ Src的/ LIB / LIBA
/ Src的/ LIB / LibB
/ Src的/ LIB /的LibC
在这种情况下,我必须将它们归结为与归档中存在的结构不同的结构,或者至少将它们放入不同的目录中:
/ Src / ProjectA /项目A
/ Src的/项目A / LIBA
/ Src的/项目A / LibB
/ Src的/项目A /的LibC
/ Src / ProjectB / B项目
/ Src的/项目B / LIBA
/ Src的/项目B / LibB
/ Src的/项目B /
的LibC
或
/ Src的/项目A
/ Src的/项目B
/ Src的/ LIB / LIBA
/ Src的/ LIB / LibB
/ Src的/ LIB /的LibC
(抱歉格式错误,我很努力说服这不是代码)
但是使用这种结构,当你从项目A切换到B的开发时,你需要切换Lib目录......不是我想做的事。
在我看来,为了在GIT中这样做我想要多个Git repo,也许每个Lib一个
我最近被告知第一个选项,将多个版本带到不同的位置,这将是一个坏主意。 (他在SVN下谈论,所以可能不适用),我工作的公司几年前在Source Safe下做过这种事情并且工作得很好 - 我们能够创建一个指定每个lib的版本标签的文件关闭并使用NANT脚本来获取正确的版本,并可以根据需要更新它们。 (不知道这里最简单的方法是,最初,它会更简单。就像一个文件说明它需要什么版本或者其他东西)可以做的另一件事是在所有项目中应用标签A的发布源代码如下:“RELEASE_1_0_PROJECT_A”并根据该版本标签降低所有源代码。 (标签或任何你想称之为的)
虽然源安全,但标签只在该位置及以下位置,而不是整个仓库。
我还在他们工作的地方分支代码并创建一个新的顶级树,例如:
/ 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...
评论:“默认情况下,拒绝更新非裸存储库中的当前分支,因为它会使索引和工作树不一致......”
听起来我会LOL关于某人发表评论 - 基本上,它听起来像是说:“你只能将文件签入一个空的.Git Repo,因为否则我们会弄乱你的工作目录与你不匹配刚签到。“
所以,我的新问题:我如何检查更改?什么是简单/匹配的东西?我使用哪个(看起来它给了我命令,使其成为默认值。)
感谢。
答案 0 :(得分:4)
听起来你想使用子模块。
您有五个存储库:
项目A将有三个子模块,每个子模块一个。项目B还有三个子模块,每个子模块一个。
当您克隆项目时,您将确保使用--recursive
并且您将在正确的版本(不同项目的不同版本,如果您需要)中检出所有库源。更新库代码时,您需要将更改提交到项目代码中,以便项目使用新版本的库。
子模块通过在父项目中存储子模块版本的SHA-1的引用来工作。因此,项目A的1.0版将引用Lib A的提交abc123...
,它对应于Lib A的1.0版本。当您检查项目A时,您将自动获得Lib A的1.0版本。
答案 1 :(得分:1)
请花点时间用git弄脏你的手,并研究一下Scott Chacon的"Pro git",Ben Lynn的"git magic"并在附近的git's homepage链接了各种教程/备忘单。根据开发组的范围,您还应该阅读git工作流程。早期发现git可以做什么和不能做什么,它与你所知道的系统不同(并且 差异),过去只是管道梦想或不可能复杂的东西在git中是微不足道的;在提交如何组织数据和工作流程之前,可以在以后节省许多挫折。
正如我在学习英语时被告知的那样:不要翻译,学习用英语思考。当你做梦时,你会完成的。是的,这需要时间。但是节省了时间。