如何让 SVN 或者 GIT 保留 Linux 文件权限

2016-10-08 12:18:17 +08:00
 shijingshijing

想问一下各位是怎么让 SVN 或者 GIT 保留 Linux 文件权限的。

背景: 十一期间帮朋友解决一个问题,他们的知识库是用 WordPress 搭建的(which is a stupid choice),历史原因没有用 Wiki ,中间还间断自己根据需求开发了一些插件,自己重新修改过主题,总之各种更改。现在他们想把这个知识库开放给合作伙伴使用,而且对其进行更进一步的开发,部分合作伙伴会参见进来协同开发。

以前他们对这个 WP 系统预想的比较简单,就是一个纯粹的知识存档和检索的系统,一直是单人开发,当初也没怎么重视,都是怎么简单怎么来,没有进行过版本控制和配置管理,最多也就简单进行备份。开发的流程也很简单:开发者自己在虚拟机的 Ubunutu 8.04 里面修改 -> tar 包 + .SQL 文件 -> Ubuntu 8.04 服务器部署,这个过程由于 tar 包能够完整的权限,基本上没有问题。

现在他们想把开发人员增加到 3 人。十一期间他们尝试了用 SVN 进行版本管理,将当前 Ubuntu 8.04 服务器上运行的版本用 tar 打包并导出了.SQL 文件作为后续开发的基线,个人负责开发各自功能模块,然后提交到 SVN 服务器,最后从 SVN export 出来放回到 Ubuntu 8.04 服务器上部署。

现在的问题是:在用 SVN 管理的过程中,发现 SVN 不能够保留 Ubuntu 下文件和文件夹权限。我做了个简单的实验,从基线中恢复到本地虚拟机里面的某个文件夹原来的权限是 744 ,将权限变更为 766 ,然后导出再 Commit 到 SVN 服务器的时候, SVN 提示没有任何 update 。

在 StackOverflow 里面找了半天,发现 SVN 和 Git 都默认不保留文件权限,也有介绍使用 asvn 等第三方模块的:

http://stackoverflow.com/questions/56149/storing-file-permissions-in-subversion-repository

http://stackoverflow.com/questions/3207728/retaining-file-permissions-with-git

我想问一下各位是如何处理这个问题的?特别是各位 CM 们,最好是使用 SVN 原生的方法。

PS:他们的系统可能比较特殊,内部封闭使用,不能连外网,系统也是多样的,有的时候是 Win XP ,有的时候是 Win 7 ,有的时候是 Ubuntu 8.04 ,这个是历史原因。

4609 次点击
所在节点    git
19 条回复
gsls200808
2016-10-08 12:54:26 +08:00
我记得 git 更改权限提交会进版本
jhaohai
2016-10-08 12:57:39 +08:00
git 本来就有的啊
FifiLyu
2016-10-08 13:02:10 +08:00
Linux 下 git 是会保留文件权限的。
kokutou
2016-10-08 13:02:32 +08:00
git 有。。
Clarencep
2016-10-08 13:06:27 +08:00
git 大法好...
tracyone
2016-10-08 13:07:00 +08:00
8.04 ……这个系统上的 git 说不定还真没有权限的区分,楼主不知道怎么想的用这个停止维护的系统
shijingshijing
2016-10-08 13:32:57 +08:00
@gsls200808
@jhaohai
@FifiLyu
@kokutou
刚看到那个 StackOverflow 上面的帖子是 6 年前的。。。 应该是后来 Git 加上去的吧。我看那个 SVN 的帖子说 SVN 不保留权限也是有道理的,系统太多了,要考虑 NFS , POSIX 各种兼容什么的,还要考虑漏洞啥的,不知道 Git 是怎么处理的。

对了,打的匆忙忘记说了,他们现在用的配置管理服务器是 Visual SVN Server ,因为还有其他项目是挂在这个 Visual SVN Server 系统下的,所以他们倾向于用这个 Visual SVN Server 来管理,人员的权限都已经配好,对他们来说就是新加一个 Repo 的问题。如果让他们单开 Git 可能要重新考虑一下。

最后,我对这个问题主要是有几个方面的考虑:

1 ,是 SVN 的问题还是系统的问题,我做实验用的是本地 Win XP 系统 + VMWare 跑 Ubuntu 8.04 虚拟机(直接 VMware 拷过来的)+ TortoiseSVN 客户端,服务器 Win 2008 R2 + Visual SVN Server ,这个配置的目的是尽量模拟他们的环境。第一次用的是他们正在使用的老版本 Visual SVN Server ,后来我又重新部署了官网的最新版 Visual SVN Server(32 bit),还是一样。

2 ,按照 @FifiLyu 的回复, Linux 下面 Git 是能够保留权限的,请问 Win 下面 Git 能够完整保留权限么?因为他们的配置管理服务器做了 RAID5 ,所以尽量跟这个 Visual SVN Server 放在同一台服务器上。

3 ,如果折腾完了,我还想了解一下, Linux 下面最新版的 SVN 是否能够和 Git 一样完整保留权限。

最后,他们是做嵌入式的公司,这个知识库包含了很多客户的 Case Study ,不方便对外,所以只能够内部封闭使用。


@tracyone
不是我想用这个 Ubuntu 8.04 系统,是他们有很强制性的理由用这个,这个上面还跑了其他的比较重要的 Service ,迁移成本很高。


综上,目前我估计会建议他们干脆新开一台 Linux 服务器,专门用来放 Git 和 Apache 跑 WP 。
sutra
2016-10-08 14:27:57 +08:00
svn propset svn:executable
svn propdel svn:executable
shijingshijing
2016-10-08 14:46:28 +08:00
@sutra 这个是针对 x 属性的, stackoverflow 里面有说,如果是普通文件,不加可执行,是没办法保留的原始权限的。
ceyes
2016-10-08 14:55:39 +08:00
换个思路,可以在 makefile 里做操作把相应的权限设置好
shijingshijing
2016-10-08 15:29:23 +08:00
@ceyes stackoverflow 里面介绍的 metadata file 也是这个思路,不过还是先试试看 git 吧。
Balthild
2016-10-08 16:27:54 +08:00
git config --global core.filemode true
zxq1002
2016-10-08 16:33:28 +08:00
Git 可以保留权限,但需要在 Linux 上
Sasasu
2016-10-08 17:12:41 +08:00
git 可以保留权限。

我见过有人为了解决 zip 不支持权限,多维护了一个 permission.sh
FifiLyu
2016-10-08 17:30:48 +08:00
楼主,在 Windows 上 Git 是不能保留权限的。 SVN 估计在所有平台上都不能保留权限,多年未使用 SVN 了也不是非常全定。

你的情况涉及太多方面,大家都没法针对性的回复你的问题,只能大概聊聊工具本身相关的内容。

最后,还是建议用全新的虚拟机安装 Ubuntu+Git 做服务端。
shijingshijing
2016-10-08 23:30:46 +08:00
@FifiLyu 虚拟机做配置管理不好使吧。。。
sweelia
2016-10-08 23:45:52 +08:00
@shijingshijing 可以考虑专门写个脚本批量自动修复权限。这个脚本进代码库,每次拉完代码执行一下就好
shijingshijing
2016-10-08 23:47:06 +08:00
@sweelia 是的,前面的 metadata 管理也是这样做的,关键是到时候不是我用,也不是我来维护。。。
FifiLyu
2016-10-09 09:32:42 +08:00
@shijingshijing 其实,虚拟机是可以的。看情况选择合适的方法吧!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/311119

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX