在Git仓库中保护文件

10

我有一个中央代码库,其中包含一些我希望保护不受其他用户更改(通过push)的文件子集。如果将这些文件添加到.gitignore中,则它们将无法被克隆。

是否可以在克隆所有文件后,在客户端上将其中一些文件添加到.gitignore中?


.gitignore 是否提交到仓库?为什么要保护这些文件?.gitignore 是否添加了任何类型的每个用户访问权限,或者您的更改意味着 没有人 可以更改这些文件?您想实现什么目标? - Lasse V. Karlsen
是否可以选择简单地拒绝修改那些文件的推送?您还可以提供客户端挂钩来拒绝错误提交。 - Cascabel
4个回答

1

如果你需要这种级别的访问限制,我认为问题可能出在其他地方。

尽管如此,如果你确实想要实现这个功能,请考虑使用Gitolite。它允许你定义相当详细的访问规则,可能已经足够满足你的需求。

Gitolite文档:http://gitolite.com/gitolite/master-toc.html

您可以定义“虚拟引用”来控制文件级别的访问权限。更多信息请参见:http://gitolite.com/gitolite/vref.html


1

我最初考虑了一个过滤驱动程序(参见专业书),它会做以下几点:

  • 在污点步骤保存您的文件内容
  • 在清理步骤还原您的文件内容。

alt text

但这不是一个好的解决方案,因为这些脚本涉及无状态文件内容转换(请参见this SO answer)。

您可以尝试在钩子中强制执行保存/恢复机制(请参见相同的SO答案),但请注意它将局限于您的存储库(它仅保护您存储库中的文件,而不会推送钩子)

您也可以使用:

git update-index --assume-unchanged file

请参见 "使用git,在命令行中临时排除已更改的跟踪文件以进行提交", 这只是一种本地保护方法。它可以防止外部推送到您的存储库("导入"),但如果您发布它们("导出"),则可以在客户端上进行修改。


谢谢。我知道git update-index --assume-unchanged,但它只适用于客户端。我也了解钩子,但它们不会从中央仓库克隆。 - andrexus
@andrexus:我知道:过滤驱动程序是唯一可推荐的解决方案,但这将需要修改smudge脚本以强制其了解相关文件的路径(以保存/恢复),而它只应该知道文件的内容... - VonC

1

您可以将文件放入存储库中,提交它们,然后将它们添加到.gitignore中,并从下一次提交中删除它们。

您仍然可以在先前的提交之前直接获取文件(可能使用某些标记进行标记,以便更轻松地按名称获取),这将保留文件的状态,同时不会使其在存储库中意外编辑。

要在拉取克隆后访问这些文件,只需编写一个Rake任务,为您的存储库用户获取它们即可。


0

Git必须成为解决方案的具体原因吗?

将文件设置为只读,规定这些文件不应该被推送作为 策略,这样如何?

有时候技术解决方案并不是最简单的方法。

如果有人确实推送了更改到这些文件,这些更改总是可以被还原。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接