有没有办法以只读模式运行git?

有没有办法以只读模式运行git?,git,readonly,Git,Readonly,我正在编写一个脚本,以便在当前目录的每个子目录中运行类似于git status的内容,这样我就可以快速获得有关几个git repo的信息。但是,我想阻止任何修改repo的命令。我不想一次做十笔回购。我不能只使用git子命令的白名单,因为我可能希望运行git branch-a来查看每个repo中的分支,而不是git branch new branch name来创建每个repo中的新分支 那么,有没有一种方法可以运行git,这样它将中止,而不是对repo进行任何修改,但在运行只读命令时工作正常 编

我正在编写一个脚本,以便在当前目录的每个子目录中运行类似于
git status
的内容,这样我就可以快速获得有关几个git repo的信息。但是,我想阻止任何修改repo的命令。我不想一次做十笔回购。我不能只使用git子命令的白名单,因为我可能希望运行
git branch-a
来查看每个repo中的分支,而不是
git branch new branch name
来创建每个repo中的新分支

那么,有没有一种方法可以运行git,这样它将中止,而不是对repo进行任何修改,但在运行只读命令时工作正常


编辑:我要做的是生成一个git subdirs命令,它的工作方式如下:当我键入
git subdirs command ARGS
时,我想对*/中的dir执行类似于
的操作;执行cd$dir&&git命令ARGS&&cd。。;已完成
(仅限附加错误检查)。除了如果git COMMAND ARGS以任何方式修改repo,我不想这样做,因为我不太可能对许多不同的repo进行相同的更改。

也许您确实可以使用命令白名单。使用git-show-ref或git-for-each-ref代替git-status使用git-diff-files和git-branch。确保检查低级(管道)命令。您可能会找到一个简单的、针对所有脚本需求的低级别命令。

也许您确实可以使用一个命令白名单。使用git-show-ref或git-for-each-ref代替git-status使用git-diff-files和git-branch。确保检查低级(管道)命令。您可能会找到一个简单的、有针对性的低级命令来满足您的所有脚本需求。

为什么不拒绝对存储库目录的写访问

$ chmod -R -w repo.git

为什么不拒绝对存储库目录的写访问

$ chmod -R -w repo.git

这有点麻烦,但您可以简单地以没有存储库写入权限的用户的身份运行脚本。为了避免输入密码,您可以使用ssh密钥对,并将ssh作为该用户输入到您自己的计算机中。(或者可以通过sudoers进行配置?)

与白名单不同,它保证不会有任何意外漏洞或过度的限制。它不需要实际修改回购协议的权限,只需要用户对其进行操作的权限。而且它不需要像git daemon那样进行任何额外的设置


(我想我应该注意到,没有内置的“只读”选项可以传递给git。它只是尝试做一些事情,如果它有权限的话,就做这些事情。)

这有点麻烦,但您可以作为没有存储库写权限的用户运行脚本。为了避免输入密码,您可以使用ssh密钥对,并将ssh作为该用户输入到您自己的计算机中。(或者可以通过sudoers进行配置?)

与白名单不同,它保证不会有任何意外漏洞或过度的限制。它不需要实际修改回购协议的权限,只需要用户对其进行操作的权限。而且它不需要像git daemon那样进行任何额外的设置


(我想我应该注意到,没有内置的“只读”选项可以传递给git。它只是尝试做一些事情,如果它有权限,就会做这些事情。)

我使用unionfs fuse实现了这一点。这是完全不可移植的,但它在Ubuntu上对我有效。在包含所有git repo的目录中,使用
git subdirs status
进行尝试


您可以从Github获得它:

我使用unionfs fuse实现了这一点。这是完全不可移植的,但它在Ubuntu上对我有效。在包含所有git repo的目录中,使用
git subdirs status
进行尝试


您可以从Github获得它:

这里的问题是,repo通常应该是可写的,而不是出于这个脚本的目的。此操作也很难撤消-为了安全起见,存储库的某些内容始终是写保护的,因此您无法执行
chmod-R+w
来撤消它。感谢您为我提供评论。这正是此解决方案的问题所在。另一方面,我可以使用unionfs fuse对我的回购协议进行只读查看。这里的问题是,回购协议通常应该是可写的,而不是出于此脚本的目的。此操作也很难撤消-为了安全起见,存储库的某些内容始终是写保护的,因此您无法执行
chmod-R+w
来撤消它。感谢您为我提供评论。这正是此解决方案的问题所在。另一方面,我可以使用unionfs fuse对我的回购协议进行只读查看。对管道命令的看法很好,但有时也可以使用一些陶瓷命令。我认为维护白名单可能会变得相当乏味,但根据使用案例,它可能值得一试。关于管道命令的感觉很好,但有时有一些瓷制的命令也很好。我认为维护白名单可能会变得相当乏味,但根据使用情况,它可能值得一试。您想阻止获取吗?我可以看到,对于这样的脚本,这是一个非常常见的用例,您可能会认为它没有修改repo,但它肯定会修改。我仍然可以为fetch或push之类的命令实现一个白名单,以非破坏性方式修改,但最好从一个基线实现开始,它没有能力用一个错误输入的命令意外破坏10个repo。事实上,如果使用
-f
,推操作可能是破坏性的,所以它就像您的
git分支
示例。@matrixprog:push(假设它是到真正的远程应用程序)不会对本地存储库执行任何操作,
-f
或不执行任何操作。哦,对了!说得好。但是,如果您想避免更改本地代表