【发布时间】:2016-03-29 23:40:47
【问题描述】:
我被要求编写一个脚本以在 Visual Studio 的构建后事件中运行,该脚本将通过将所有更改(包括新的(未跟踪的)文件)提交到本地“自动提交”分支来响应输出更新构建.这个想法是为了帮助懒惰的开发人员经常备份可构建代码,这样他们就可以避免丢失他们的工作。
我目前的做法(见下面的 sn-p):
如果用户不在自动提交分支上,我会存储他们的更改和未跟踪的文件,签出自动提交分支,应用存储,然后提交,然后返回到上一个分支并从存储中弹出以返回初始状态.
我的问题:
如果文件在用户当前分支上未跟踪,但已自动提交到自动提交分支,则git stash apply 无法用存储中未跟踪的版本覆盖自动提交分支上跟踪的文件。
从git stash documentation 看来,我似乎没有任何相关参数可以在apply 调用中使用来解决这个问题。我可以通过解析git status --porcelain 以?? 开头的行的结果,在存储之前检测当前分支中未跟踪的文件,但这不会告诉我哪些文件已经在自动提交分支上被跟踪。
我目前需要使用 Windows 批处理文件,因此我想将我的解决方案限制在任何开发机器上可能在该环境中可用的工具上。
这是我当前方法中的相关 sn-p:
git stash save --include-untracked -keep-index
git checkout autocommit
git stash apply
git add -A
git commit -m "Autocommit of build %VERSION%"
git checkout %BRANCHNAME%
git stash pop
偏离 git 哲学
自动提交过程旨在严格用作一个方便的、基于 git 的自动保存系统,它不需要开发人员在每次成功重建项目时触摸 git 或采取任何额外的手动步骤。
它不符合普通的 git 哲学,因为它不打算用于源代码控制或代码共享。我只是想使用 git 为开发人员提供快照以恢复到例如如果他们因文件损坏而失去项目。这将导致大量微小的提交而没有什么个人价值,这没关系 - 事实上,它非常适合我的需求。
脚本假定当前分支上未提交的更改可以合理地应用并提交到自动提交分支。假设无效的任何原因都将由开发人员与 repo 的直接交互引起。作为任何此类交互的一部分,开发人员负责相应地更新自动提交分支,以便脚本的假设在下次运行时有效。
【问题讨论】:
-
我确实意识到 cmets 说“不要这样做”是多么无益,但我强烈建议更好的选择是培训开发人员经常自己提交。这听起来像是会鼓励不良练习。另外,如果
%BRANCHNAME%的上游发生了某些变化,会发生什么情况?您需要先变基或合并您的autocommit分支,不是吗? -
@DaveyDaveDave 一个有效的观点,我倾向于同意。在这种情况下,开发人员确实练习了良好的做法,他们还希望一些方便的自动化系统利用 git 功能通过高频率备份他们的本地工作以获得广泛的历史来帮助他们的个人工作流程。理想情况下,自动提交分支永远不会被合并到另一个分支中,或者实际上不会参与除自动提交过程和历史审查之外的任何操作。
-
至于上游更改的影响,我假设开发人员会注意并以某种程度的智能管理自动提交分支的同步。除非有一个我没有考虑的细节(很可能 - 我不是 git 大师),否则我很满意忽略自动提交过程中的那一点复杂性。
-
我在这里很可能错了,我必须对其进行测试才能确定,但假设
autocommit分支在提交C1并且我继续master将它带到C5,文件foo已更新。如果然后我自己更改foo并尝试将其提交给autocommit,而不将C2更改为C5,会不会有可怕的冲突?我必须承认我有偏见,因为在 90% 的情况下,git up自动存储东西并出错,所以可能没有我想的那么糟糕...... -
@talrnu,每次提交都是一个小的有意义的更改会很有意义。如果只是很多零散的小改动,其实适得其反。好好想想吧!
标签: git git-commit git-stash post-build-event