amn*_*amn 18 versioning git auto-versioning
我看到这个问题已经变得有点流行了.现在已经是我公认的Git使用年限了,从那以后我学到了很多东西.请,拜托之前,不管你会从这个Q&A得知事情对你的Git冒险阅读最后一段.
我想编写应用程序构建版本,该版本是从我所在的GIT分支名称(构建时)和自分支分歧后的提交数量自动派生的.我相信这对我的GIT存储库中的任何提交都是唯一的吗?分支名称是唯一的,并且提交沿着分支相互链接?如果我标记提交,我也可以使用该标记作为前缀.
在某种程度上git describe做我想要的,但它不包括我所在的分支名称,它包括缩写提交SHA-1哈希,我认为我不需要它,因为它不会添加任何东西到字符串的熵并且可能是多余的(我可能在这里错了,所以请纠正我).
我有什么选择?我在这里想的是正确的方向吗?当我有更多关于软件开发的重要事项时,我只是厌倦了为版本添加数字.
顺便说一下,我从来没有用肮脏的工作树建造.即我在构建公共发布之前总是将更改提交到存储库.
我现在知道 Git分支只是提交引用,因此,许多分支(和标记!)可能指向单个提交.因此,问题"这个提交属于哪个分支/谎言" 对Git 来说并不完全有效.Git 会跟踪你正在使用的"当前"分支 - 它已经为你检查过的分支 - 但同时任何数量的其他分支可能指向同一个提交,并且可以说没有任何一个分支可以被选择为"main"除非您想要表示当前已签出到磁盘的那个.请阅读本页面上的以下答案进行详细说明.
Ari*_*zis 11
关于git,你要了解的是分支本质上只是提交书签.foo您在0deadbeef提交时在分支上的事实对于提交本身并不重要; 分支不是其身份的一部分.
(Mercurial将分支名称加入提交.在各种方面,这是次等的,正如Dustin Sallings所解释的那样.)
即使假设git describe只使用当前检出的分支 - 如果你有一个可乐的历史,可能会有多条路径导致使用相同的最新标记提交git describe.所以甚至没有一个分支.
另一个注意事项:您可能会反对即使"标记X中的第3次提交"在一般情况下是不明确的,git describe也可以查看图形并确定它是否含糊不清,如果没有,则省略哈希.但是,没有什么可以阻止任何人在以后的时间点在该标记的顶部开始分支 - 那么你的describe字符串将会回溯变得模棱两可.
底线是提交的唯一明确标识符是其哈希.所以那必须在那里.什么git describe是在Git模型的范围内添加一些冗余(并且在提交编号,模糊的情况下)使得描述对于人类定向的空间/关系理解的类型更有用的信息.
Jee*_*eet 11
这是我使用的:
echo "`git symbolic-ref HEAD 2> /dev/null | cut -b 12-`-`git log --pretty=format:\"%h\" -1`"
Run Code Online (Sandbox Code Playgroud)
它产生如下:
master-6de772e
Run Code Online (Sandbox Code Playgroud)
正如亚里士多德所指出的,实际上SHA-1本身就是提供明确的构建标记以及有关发展历史背景的完整信息所必需和充分的.其他一切都是多余的,因为他们提供的任何信息都可以从SHA-1中找出或得出.然而,人类可能也喜欢实际分支的补充上下文信息(或者,至少,这个人类),并且因此将分支名称嵌入到标签中.由于这个原因(即直接人工解析信息),我的大多数项目也使用更长的构建标识"描述",其中包括构建所基于的提交的日期和时间以及构建标识的标签'如上所述.
git describe --long始终会输出这样的版本号:v1.2-10-gdeadbee,这意味着自带注释的标签“ v1.2”指向第十次提交,即指向带有缩短的SHA-1“ deadbee”的提交。因此,您要做的只是标记分支开始(分支的分支点),例如。<branch>-start
需要缩写提交SHA-1哈希来区分模棱两可的情况,因为“例如,标记为'x'的第3次提交”不能唯一地区分提交;在非线性,分支发展的情况下,可能有不止一次符合上述描述的提交。例如,在下面的ASCII艺术图上所示的情况下,两个带有*标记的提交都适合“自标记'x'之后的第三次提交”说明。
/-.---*---.- \
/ \
.--- x ---.---.--- * ---.--- M ---。<---分支
请注意,在如上所示的“合并”情况下,您不能使用分支名称来区分具有相同描述的两个提交。
因此,您要做的就是自己获取git describe --long输出(此--long选项是为了避免与解析产生歧义,请参阅git describe manpage),解析它并添加当前分支信息(例如git symbolic-ref HEAD,而不是通过粘贴git branch输出)。
小智 5
官方发行版应该有一个带有版本号的标签.在这种情况下,我建议采用以下方法:
这个单一命令应该有效:
git describe --exact-match 2> /dev/null || echo "`git symbolic-ref HEAD 2> /dev/null | cut -b 12-`-`git log --pretty=format:\"%h\" -1`"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12373 次 |
| 最近记录: |