我已经看过很多博客帖子,并且我自己也经历过,Mercurial不保留从一个repo推送到另一个repo的文件的权限。有没有人知道保留权限的Mercurial扩展?我假设它不能用钩子完成,因为钩子知道原始仓库的权限是什么?
要求详细说明:
如果对文件的唯一更改是权限更改(例如chmod o+r filename
),则提交文件的尝试将失败并显示文件未更改的消息。
如果我提交的文件具有权限600(rw -------),则克隆repo,克隆中的同一文件具有权限664(rw-rw-r - ):< / p>
: nr@yorkie 6522 ; hg clone one two
updating working directory
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
: nr@yorkie 6523 ; ls -l one two
one:
total 4
-rw------- 1 nr nr 8 Aug 18 21:50 foo
two:
total 4
-rw-rw-r-- 1 nr nr 8 Aug 18 21:51 foo
此示例显示hg clone
不保留权限,但hg push
也不保留权限。
在我的应用程序中,一个回购邮件是在公共可访问的路径上,并且它非常重要
多个用户有权更改回购
公共仓库中的文件只有在明确可读时才可读。
答案 0 :(得分:33)
看起来可以使用挂钩和辅助工具(以及一点点口香糖和打包线)来完成:
获取David Hardeman的Metastore,保存并恢复文件元数据。
更改来源,以便忽略目录.hg
以及.git
。
使用以下Mercurial钩子:
precommit.meta = metastore -s
changegroup.update = hg update
update.meta = /usr/unsup/nr/bin/metastore -a
您必须将.metadata
文件添加到repo。
此lashup大部分时间都可以使用,但如果您只更改 权限并想要传播它,则必须运行metastore -s
才能将这些更改推送到.metadata文件,其中hg将看到更改;否则提交认为没有什么是新的。
答案 1 :(得分:16)
如何使用Mercurial FAQ中的此解决方案:
如果您使用Mercurial进行配置 文件管理,你可能想要 跟踪文件属性(所有权和 权限)。只有Mercurial 跟踪每个的可执行位 文件。
以下是如何保存的示例 属性和文件(工作 在Linux上如果你有 acl 包 安装的):
# cd /etc && getfacl -R . >/tmp/acl.$$ && mv /tmp/acl.$$ .acl # hg commit
这远非完美,但你明白了。有关更复杂的解决方案,请查看 etckeeper。
答案 2 :(得分:1)
对于/ etc目录的特定情况,etckeeper看起来很有趣。
答案 3 :(得分:0)
由于作者站点上的dead git链接,我认为 metastore 被放弃了,所以我剔除了下面的内容,这些内容直接放置在repo的.hc/hgrc
配置文件中:
[paths]
default = ...
[hooks]
# NOTE: precommit is different than pre-commit, see https://www.mercurial-scm.org/repo/hg/help/hgrc for list of hooks
pre-commit =
# export permissions
hg st -camn0 | sort -z | xargs -0 getfacl > .hg.hook.pre-commit.acl.export
hg add .hg.hook.pre-commit.acl.export
# export timestamps
hg st -camn0 | sort -z | xargs -0 stat > .hg.hook.pre-commit.stat.export
hg add .hg.hook.pre-commit.stat.export
update =
# import permissions
setfacl --restore=.hg.hook.pre-commit.acl.export
# import timestamps
# TODO: use touch to restore timestamps
答案 4 :(得分:-1)
在VCS中存储权限不是一个好主意。但是,Mercurial支持“可执行”标志(这与权限不同,尽管在Unix中可执行标志是权限的一部分)。