使用git时,有没有一种方法可以锁定fork上的单个文件或目录?


72

我们是一个由60多个开发人员组成的团队,他们致力于同一产品,并且正在从SVN迁移到Git和GitHub。SVN中有一个过程,其中单个文件中的文件被锁定,并且每当开发人员要提交代码时,他都需要文件所有者将其解锁。我们三个人是150多个文件总数的所有者。解锁之前需要进行代码审查。

在Github中,我们计划使用Fork-Clone模型-一个开发小组正在处理的每个项目都将创建一个fork,每个开发人员都将创建一个fork的克隆,编写代码并提交至origin,即功能将向上游发出拉动请求。

尽管这看起来不错,但问题在于大型项目交付时,它带来了许多更改以供审核,因此增加了文件所有者的负担。另外,这可能会在以后的开发周期中发生,因此该项目可能会受到威胁。

我们认为一种可行的方法是在将git push到原点(叉子)时使用钩子。最终可以将git pull移到上游。

但是,我们找不到相同的任何github扩展或推钩。有没有一种快速的方法(阅读的,现有的扩展名)可以用Github做到这一点,还是应该使用与git相同的钩子?


8
我觉得Git缺少文件锁定功能(在SVN中这很烦人)。在大多数情况下,我很确定拉请求和分支是您的最佳选择。您甚至可以使用子模块将项目的不同部分分离到不同的存储库中,这样团队之间的分隔(文件保护)就更加清晰了。因此,文件所有者将成为主要的子模块所有者,并且他修改了团队在其主要分支上提出的每个拉取请求。然后每个用户都有自己的分叉。
西蒙·布德里亚斯


5
@SimonBoudrias如果将git用于不存在合并工具的任何文档类型(几乎总是这种情况),则您的想法完全无效。随着TortiseSVN / WebSVN我们可以避开微软的Exchange,但混帐我们不能。我认为,这是git的一个非常不幸的失败。
彼得-恢复莫妮卡

Answers:


-24

这个用例是Git比SVN好得多的原因之一->变基!如果您遵循良好的git工作流程,则可以在提交“拉取请求”之前从上游进行基础调整。您无需担心文件锁定和踩踏其他人的提交以及合并冲突等问题……重新设置基础可将您的工作搁置一旁,应用远程提交,然后再将您的工作放在最前面。

我认为这只是需要重新考虑您的流程,并依靠git的优势而不是强制将git的Subversion工作流程安装到git之上。您的“前叉克隆”模型也可能需要另一种外观。大多数情况下,每个开发人员都有自己的分叉,您可以根据需要通过团队之间的远程共享仓库。但是,具有相同血统的贡献者会养成一些不良习惯。

Gitflow是一个非常流行的git工作流程,Github本身也提供了一些不错的技巧并分享了他们的工作流程


91
只要您具有可合并的文件,此方法就起作用。如果您有二进制文件(如Word文档),则会陷入困境。
2013年

11
Git比svn更好,反之亦然。Git非常适合使用非二进制文件的开发人员。在我们公司的二进制文件案例中,我们选择了svn,因为它比git(在我们测试的场景中)更好地处理大型二进制文件(20mb +和100+版本)ps:我喜欢git,
2014年

46
投反对票,是因为您没有说服提供解决方案,而是说服人们不需要他们想要做的事情,因为Git还有其他东西。如果您将更改基于其他人的更改,这是否就意味着不会有任何冲突(即,编辑相同的行),并且您肯定不会覆盖其他人的工作。我真的不这么认为
xorcus 2015年

3
@ pan40,你不能。句号
USR-本地ΕΨΗΕΛΩΝ

4
我不同意这个答案,因为改组不是解决冲突的灵丹妙药,更糟糕的是!除非有人欺骗了工作副本或滥用了强制盗用锁,否则SVN锁的目的是警告人们某些人正在对文件进行大量修改。在Git重新存储中,如果一个人将多个提交应用于其他人修改的同一文件,则他将不得不解决每次重播的冲突。在这种情况下,合并将更便宜,因为您只需解决一次冲突,但这并不是锁定的目的。当然,良好的项目管理和协调帮助
USR-本地ΕΨΗΕΛΩΝ

92

如果文件不可合并,并且您需要将其锁定,则没有机会,请使用集中式解决方案而不是GIT,即SVN或ClearCase。


7
这是正确的答案。在撰写本文时尚未接受。已投票。它甚至不必是必需的锁定二进制文件。例如,在另一个问题的iOS故事板上进行评论。
Harindaka'3

iOS故事板?“其他”问题?您可以链接吗?
USR-本地ΕΨΗΕΛΩΝ

我相信@Harindaka的意思是“其他答案”,而不是“其他问题”。注释被简称为:stackoverflow.com/questions/13662255/...
比利·乔

1
我们拥有的一个用例是高度标准化的XML文件。例如,我们有一个字符串表。如果有人修改了文件中的字符串,则必须更改表,并假设它是字母顺序的,之后的每个字符串引用都必须加一。总的来说,对文件中的差异进行了微小的更改,但是却是一场噩梦。因此,我们锁定。尽管如此,差异的存储是作为UTF-8文件差异完成的,与存储整个文件相比,该差异相对较小。SVN在此用例下非常有效,并且非锁定系统将存在重大问题。
比尔-K5WL

1
听起来像是可以/应该自动生成并且不提交给存储库的东西。还是我们所有这些更改都手动完成?
Dan M.

35

如果您正在使用git LFS(某些git托管提供程序支持,例如GitHub),则可以使用文件锁定

通过编辑.gitattributes文件将文件类型标记为可锁定:

*.docx lockable
# Make MS Word files lockable

并使用以下命令锁定它:

$ git lfs lock example.docx

您可以git lfs unlock example.docx通过添加与和其他人一起解锁文件--force



2

Git不分散,因此不提供任何锁定功能。但是,如果将代码托管在GitLab Enterprise Edition Premium上,则可以使用Web界面锁定单个文件或文件夹,从而完全实现您想要执行的操作。

如果您不想将项目托管在其他人的服务器(他们的网站)上,也可以下载GitLab并将其托管在您自己的Web服务器上。


3
它与Gitlab没有关系,使用git lfs也可以。git-lfs 2.0引入了锁定文件的功能:github.com/git-lfs/git-lfs/wiki/File-Locking。TFS 2017.2中提供了对此功能的支持:docs.microsoft.com/en-us/vsts/release-notes
erradi mourad '19

2

不完全锁定,但是Github引入了一个称为“代码所有者”的概念。允许您限制部分代码库,使其仅在代码所有者检查后才允许提交



-1

在Git中无法做到这一点。正如其他人所说,如果文档是“可合并的”,则可以尝试重新定基,更改操作方式。在本例中,我们有一个约定:如果您确实需要锁定它,请重命名它。但是我们只在Office文档等中做这些事情。
这种贡献并没有提供解决方案,这是一种解决方法(但是stackoverflow不允许我将其添加为注释。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.