如何在Git中将提交的文件标记为只读?

 一切皆空2502861573 发布于 2022-12-04 15:59

我有一个文件,检入Git.该文件需要持有API密钥,但出于安全原因,我不希望将API密钥提交给Git.我解释了如何为每个开发人员生成API密钥而不是API密钥.

我不希望任何开发人员意外提交他们的API密钥并覆盖基本文件.

我有:

将文件添加到.gitignore文件中,但是,由于它已经提交,因此不执行任何操作.

跑完命令 git update-index --assume-unchanged myFile.js

将该命令添加到说明文件以通知其他开发人员他们也应该运行此命令.

但是,我刚搬到我的笔记本电脑,忘了运行命令,并意外地将一把钥匙交给了回购.我正在寻找一种更加自动防故障的方法.本质上,我想将该文件的初始版本提交给GitHub,然后禁止修改该文件.

这可能吗?

作为参考,该文件看起来像:

define(function () {
    //  The Simple API Access API key is used here.
    //  Please note that I've specifically omitted this key from GitHub for security. 
    //  Feel free to generate your own in order to use YouTube's API: https://code.google.com/apis/console/
    //  A valid key will look something like:
    //  Key for browser apps (with referers)
    //  API key: -------------------------------
    //  Referers: Any referer allowed
    //  Activated on:   Apr 6, 2014 2:46 PM
    //  Activated by:   ------------ – you
    //  NOTE: Please do not commit changes to this file once downloaded. CommandS:
    //  - Disable tracking: "git update-index --assume-unchanged src/js/background/key/youTubeAPI.js"
    //  - Enable tracking: "git update-index --no-assume-unchanged src/js/background/key/youTubeAPI.js"
    var key = 'API_KEY_MISSING';

    if (key === 'API_KEY_MISSING') {
        console.error('YouTube API key is not present.');
    }

    return key;
});

torek.. 8

隐含主题行问题的答案("我可以将git检出特定文件为只读")是"不,至少不是直接",因为git只存储每个文件的一个权限位:可执行文件,或者不是-executable.每个文件的所有其他位设置相同.

尽管如此,使用钩子有一些技巧.正如一些评论者建议的那样,您可以在服务器端钩子中测试某些内容以防止推送.您可以使用涂抹和清洁过滤器.您可以使用post-checkout钩子将文件设置为只读.

任何和所有挂钩的缺点是必须为每个存储库设置它们,并且用户可以覆盖它们(服务器端挂钩除外,假设用户无法直接访问服务器).1 这也是钩子的优点,虽然对于天真的用户来说,它可能比缺点更有缺点,因为git本身不会自动设置钩子.

post-checkout挂钩可能是设置文件权限最明显的地方,因为Git的文档包括该位:

此挂钩可用于...设置工作目录元数据属性.

方便的是,只要用户实际上在git工作树中,钩子似乎总是在顶级目录中运行,而不管用户在哪里.2 因此,这个非常简单的钩子足以将一个文件更改为只读:

#! /bin/sh
# post-checkout hook to make one file read-only
chmod -w path/to/file

(chmod无论如何,在任何系统上,并记住将挂钩设置为可执行文件).

用户必须将此挂钩放入他/她的存储库中.git/hooks/post-checkout(尽管您可以将文件本身提交到存储库中,然后让用户将其复制或链接到位,可能通过辅助设置脚本).


1因此,如果要严格执行策略,则可以使用服务器端挂钩(通常这是正确的).

2也就是说,以下内容击败了钩子:

$ pwd
/home/user/dir/example
$ ls -l .git/hooks/post-checkout
-rwxr-xr-x  1 user  group  27 Dec 18 11:10 .git/hooks/post-checkout
$ cd /tmp
$ GIT_DIR=/home/user/dir/example/.git git checkout master

在这里,当前的工作目录是正确的/tmp,并且钩子无法弄清楚它应该是什么(你可以阅读$GIT_DIR,但这不一定有用,因为.git目录不需要直接连接到第一个工作树地方,这就是首先设置GIT_DIR的意思).

请注意,在工作树是,在一个子目录,并没有打败挂钩; 这就是我所说的"似乎总是在顶级目录中运行".

1 个回答
  • 隐含主题行问题的答案("我可以将git检出特定文件为只读")是"不,至少不是直接",因为git只存储每个文件的一个权限位:可执行文件,或者不是-executable.每个文件的所有其他位设置相同.

    尽管如此,使用钩子有一些技巧.正如一些评论者建议的那样,您可以在服务器端钩子中测试某些内容以防止推送.您可以使用涂抹和清洁过滤器.您可以使用post-checkout钩子将文件设置为只读.

    任何和所有挂钩的缺点是必须为每个存储库设置它们,并且用户可以覆盖它们(服务器端挂钩除外,假设用户无法直接访问服务器).1 这也是钩子的优点,虽然对于天真的用户来说,它可能比缺点更有缺点,因为git本身不会自动设置钩子.

    post-checkout挂钩可能是设置文件权限最明显的地方,因为Git的文档包括该位:

    此挂钩可用于...设置工作目录元数据属性.

    方便的是,只要用户实际上在git工作树中,钩子似乎总是在顶级目录中运行,而不管用户在哪里.2 因此,这个非常简单的钩子足以将一个文件更改为只读:

    #! /bin/sh
    # post-checkout hook to make one file read-only
    chmod -w path/to/file
    

    (chmod无论如何,在任何系统上,并记住将挂钩设置为可执行文件).

    用户必须将此挂钩放入他/她的存储库中.git/hooks/post-checkout(尽管您可以将文件本身提交到存储库中,然后让用户将其复制或链接到位,可能通过辅助设置脚本).


    1因此,如果要严格执行策略,则可以使用服务器端挂钩(通常这是正确的).

    2也就是说,以下内容击败了钩子:

    $ pwd
    /home/user/dir/example
    $ ls -l .git/hooks/post-checkout
    -rwxr-xr-x  1 user  group  27 Dec 18 11:10 .git/hooks/post-checkout
    $ cd /tmp
    $ GIT_DIR=/home/user/dir/example/.git git checkout master
    

    在这里,当前的工作目录是正确的/tmp,并且钩子无法弄清楚它应该是什么(你可以阅读$GIT_DIR,但这不一定有用,因为.git目录不需要直接连接到第一个工作树地方,这就是首先设置GIT_DIR的意思).

    请注意,在工作树是,在一个子目录,并没有打败挂钩; 这就是我所说的"似乎总是在顶级目录中运行".

    2022-12-11 02:04 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有