是否有一个git工具可以近似于集中式建议文件锁定?

是否有一个git工具可以近似于集中式建议文件锁定?,git,version-control,locking,binaryfiles,Git,Version Control,Locking,Binaryfiles,大约3.5年来,我一直将git作为团队日常工作流程的一部分。我们倾向于一种主要集中的设置,其中有一个“受祝福的”回购协议,最多有一把叉子,主要用于没有push访问权限的人执行pull请求。由于我们主要从事游戏工作,因此我们拥有大量的二进制资产,以及其他文件(通常是元数据、用户界面布局等),这些文件仅用于机器编辑,即使它们在技术上是纯文本 如果我们在git之上构建了某种客户端工具,可以帮助我们协调对此类文件的更改,从而避免二进制(或其他无法解决的)冲突的可能性,那么我们的团队将受益匪浅。以前我们使

大约3.5年来,我一直将git作为团队日常工作流程的一部分。我们倾向于一种主要集中的设置,其中有一个“受祝福的”回购协议,最多有一把叉子,主要用于没有push访问权限的人执行pull请求。由于我们主要从事游戏工作,因此我们拥有大量的二进制资产,以及其他文件(通常是元数据、用户界面布局等),这些文件仅用于机器编辑,即使它们在技术上是纯文本

如果我们在git之上构建了某种客户端工具,可以帮助我们协调对此类文件的更改,从而避免二进制(或其他无法解决的)冲突的可能性,那么我们的团队将受益匪浅。以前我们使用非正式对话来协调咨询锁,现在我们使用Google Docs电子表格。由于我们已经在使用一个主要集中的工作流,我认为一个相当简单的建议文件锁定方案对于通信来说会更有效,因为它可以更有力地强制执行锁定。然而,我一直未能找到这样一个工具

这是我对这个工具的特性集的第一次尝试,让我了解我正在寻找的功能如果我找不到这方面的东西,我可能会在某个时候自己写这篇文章,但我宁愿不重新发明轮子


  • 这个工具要么是一个git脚本(比如),要么是一些本地钩子的组合(我们使用的是github,所以我们不能使用远程钩子,除非它们是Webhook)
  • 您可以通过运行命令来请求文件锁定,该命令可为目标文件
    foo
    创建或更新锁定文件
    .foo.gitlock
    ,内容包括某种用户id(电子邮件?)以及您认为需要锁定的大概结束日期。该工具还可以在此提交中使目标文件为只读
  • 然后,您必须提交锁文件,并将其推/拉请求给受祝福的远程(可能是源站)-第一推即赢
  • 你现在有锁了。该工具将目标文件更改为读写(如果还没有)
  • 您可以相对独占地编辑、提交和推送对文件的更改
  • 完成后,运行命令以解锁文件。它可以:
    • 保持锁定系统的跟踪,要求另一个用户在对其进行读写操作(以缓解同步问题)之前锁定,或者:
    • 您可以将其从锁定系统中删除,该系统将删除锁定文件并恢复原始目标文件权限
  • 在执行添加或更新锁文件的提交时,如果工具确定您不是锁持有者,则会确保目标文件为只读文件
  • 工具将不允许您从其他用户处获取锁(除非您通过
    --force
    或绕过该工具)
  • 该工具可以检测到过期的锁(超过其大约结束日期),但在锁支架未按压的情况下不会解锁
  • 使用本地配置数据解决含糊不清的问题(例如,定义哪一个远程设备是受祝福的,哪一个分支是主线)

我理解由于git的性质,这有缺点。例如,用户负责使自己与主线分支保持最新,以便尊重刚刚添加到锁定跟踪的文件。但这在严格的工作流程(如)下是可行的,并且可以由远程的电子邮件通知程序来辅助。无论如何,我认为这是对我们当前流程的改进

我知道git邮件列表上以前也出现过类似的问题,其他的SO问题等等。我所看到的唯一实质内容是gitolite,它很整洁,但不幸的是,作为一项政策,它不是我们的选择

参考资料:

  • (聪明的替代设计,使用一个特殊的分支在所有分支上标记文件,但未实现AFAIK)
gitolite,它很整洁,但不幸的是,作为一项政策,它不是我们的选择

如果是因为ssh访问,请注意gitolite也可以很好地与https访问集成

如中所述:

换句话说,我并不认为锁定本身就是坏的。它只是对git提供的工作流子集有用。所以我认为git不是实现它的合适地方

gitolite是一个处理锁定的好地方,因为它涉及到管理对集中存储库的访问


由于您在GitHub上,这说明了集中式文件锁定和分布式版本控制系统之间的脱节:

查看文件被锁定的最简单方法是,如果我修改了任何文件并推送,而另一个开发人员推送了同一回购协议和同一分支,我的推送将被拒绝为非快速向前推送。:我将必须先拉送(或拉送--重基)并合并之前所做的任何修改(推送之前)本地,然后再次推动

您不锁定文件,而是合并已在GitHub本地发布(推送)的任何并发修改,然后推送。

如果所述修改涉及您正在修改的文件,您可以在本地解决任何合并冲突,然后在GitHub上推送新版本。

谢谢。这是因为我们需要使用GitHub。在大多数情况下,它工作得很好,从我的角度来看,它唯一真正缺少的是远程钩子脚本。@Eliot,但它有web钩子或“更新后”钩子(可以反过来调用脚本):我想不出一种在远程上仅使用接收后钩子实现锁定的方法(github webhooks就是这么做的。)我认为它必须是一个更新挂钩,这样它才能拒绝无效的推送。“你能想出一个办法吗?”艾略特我同意。我对答案进行了编辑,以解释“文件