使用git版本控制系统锁定二进制文件

使用git版本控制系统锁定二进制文件,git,version-control,binaryfiles,dvcs,Git,Version Control,Binaryfiles,Dvcs,一年半以来,我一直在关注git社区,希望能够从SVN中转变过来。有一个特别的问题让我望而却步,那就是无法锁定二进制文件。在过去一年中,我尚未看到这一问题的进展。我知道锁定文件违背了分布式源代码管理的基本原则,但我不知道web开发公司如何利用git来跟踪源代码和图像文件的更改,因为可能存在二进制文件冲突 为了达到锁定的效果,必须确定一个“中央”存储库。不管git的分布式性质如何,大多数公司都会有一个用于软件项目的“中央”存储库。我们应该能够将一个文件标记为需要来自管理git存储库的特定地址的锁。也

一年半以来,我一直在关注git社区,希望能够从SVN中转变过来。有一个特别的问题让我望而却步,那就是无法锁定二进制文件。在过去一年中,我尚未看到这一问题的进展。我知道锁定文件违背了分布式源代码管理的基本原则,但我不知道web开发公司如何利用git来跟踪源代码和图像文件的更改,因为可能存在二进制文件冲突

为了达到锁定的效果,必须确定一个“中央”存储库。不管git的分布式性质如何,大多数公司都会有一个用于软件项目的“中央”存储库。我们应该能够将一个文件标记为需要来自管理git存储库的特定地址的锁。也许这很困难,因为git跟踪的是文件内容而不是文件

你们中有没有人有处理git和二进制文件的经验,这些文件在修改之前应该被锁定


注意:看来SourceGear的新开源分布式版本控制项目Veracity的目标之一就是锁定。

我不希望文件锁定成为git中的一项功能。您主要对哪种二进制文件感兴趣?您是否真的对锁定文件感兴趣,或者只是想防止由于无法合并文件而导致的冲突


我似乎记得有人在谈论(甚至实现)在git中合并OpenOffice文档的支持。

有必要检查您当前的工作流程,看看是否真的需要锁定图像。两个人独立编辑一幅图像是相对不常见的,一点交流可以起到很大的作用。

我同意锁定二进制文件是某些环境的必要功能。不过,我刚刚想到了如何实现这一点:

  • 有一种将文件标记为“需要锁定”的方法(如“svn:needs lock”属性)
  • 签出时,git会将此类文件标记为只读
  • 一个新命令
    git lock
    将联系运行在某处的中央锁服务器,请求获得锁定权限
  • 如果锁定服务器授予权限,请将文件标记为读写
  • git add
    将通知锁定服务器锁定文件的内容哈希
  • 锁服务器将监视该内容哈希是否出现在主存储库的提交中
  • 当散列出现时,释放锁
这是一个非常不成熟的想法,到处都有潜在的漏洞。它也违背了git的精神,但在某些情况下它肯定是有用的


在一个特定的组织中,这类事情也许可以使用脚本包装器和提交挂钩的适当组合来构建。

当我使用Subversion时,我虔诚地在所有二进制文件甚至难以编辑的文本文件上设置
svn:needs lock
属性。我从来没有经历过任何冲突

现在,在Git中,我不担心这些事情。记住:Subversion中的锁实际上不是强制锁,它们只是通信工具。你猜怎么着:我不需要Subversion来沟通,我可以通过电子邮件、电话和IM来管理


我做的另一件事是用纯文本格式替换许多二进制格式。我用StructuredText或LaΕΧ代替Word,用CSV代替Excel,用ASCII Art代替Visio,用YAML代替数据库,用SVG代替OO Draw,用abc代替MIDI,等等。

我们最近刚开始使用Git(以前用过Subversion),我发现对工作流的更改可能有助于解决您的问题,不需要锁。它利用了git的设计方式和分支的简单性

基本上,它归结为推到一个非主分支,对该分支进行审查,然后合并到主分支(或目标分支中的任何一个)

按照git的“预期”使用方式,每个开发人员发布自己的公共存储库,并请求其他人从中获取。我发现Subversion用户在这方面有问题。因此,取而代之的是,我们在中央存储库中推送分支树,每个用户都有自己的分支树。例如,这样的层次结构可能会起作用:

users/a/feature1
users/a/feature2
users/b/feature3
teams/d/featurey
请随意使用您自己的结构。注意,我还展示了主题分支,这是另一种常见的git习惯用法

然后在用户a的本地回购中:

feature1
feature2
并将其发送到中央服务器(源):

(这可能可以通过配置更改来简化)

无论如何,一旦feature1被审查,由谁负责(在我们的案例中,是该功能的开发人员,您可以让一个用户负责合并到master),执行以下操作:

git checkout master
git pull
git merge users/name/feature1
git push
pull执行一个fetch(提取任何新的master更改和feature分支),并将master更新为中央存储库所拥有的内容。如果用户a完成了他们的工作并且正确地跟踪了主节点,合并应该不会有问题

所有这一切都意味着,即使用户或远程团队对二进制资源进行了更改,也会在将其合并到主分支之前对其进行审查。关于什么时候有东西进入主分支,有一个清晰的描述(基于过程)


您也可以使用git钩子以编程方式强制实现这些方面,但同样,我还没有使用这些钩子,因此无法对它们进行讨论。

我在git讨论组中讨论了这个问题,并得出结论,目前,没有一致同意的git文件集中锁定方法。

是为了回应Mario对二进制文件在多个位置发生更改的额外关注。因此,场景是Alice和Bob同时对同一个二进制资源进行更改。它们都有自己的本地回购协议,从一个中心远程克隆

这是inde
git checkout master
git pull
git merge users/name/feature1
git push