有时我必须修改配置文件,例如/etc
由 etckeeper 创建的存储库。因此我这样做:
sudo git commit -am "Modified this setting"
不幸的是,它会使用 root 凭据提交。一个肮脏的替代方案是
sudo git commit -am "Modified this setting" --author "John Doe <[email protected]>"
还有其他解决方案吗?
另一个例子是我的/var/www
文件设置了0640
和root:www-data
。如果我想修改这些文件,我必须从上下文中进行修改root
。如何使用我自己的用户帐户进行修改?
答案1
只要您已将 git 正确配置为普通用户,此简短脚本便可用于实现您想要的功能。它接受git commit
除(它会自动生成)之外的任何和所有参数--author
,并会自动提示您输入密码,因此您不必使用以下命令运行它sudo
:
#!/bin/bash
name=`git config --get user.name`
email=`git config --get user.email`
author="${name} <${email}>"
sudo git commit --author "$author" $@
它从用户的 git 配置中提取您的姓名和电子邮件,从中编写作者信息,然后调用 git 创建提交。您可以替换commit
任何其他生成提交并接受参数的 git 子命令--author
。
或者,以普通用户身份克隆存储库(通过 SSH 克隆,因此对于您的/var/www
示例,它将是git clone root@localhost:/var/www
),以普通用户身份进行提交,然后将它们推送到主存储库。这为您提供了更多自由来根据需要管理您的副本,但要求人们能够通过环回接口上的 ssh 以 root 身份登录。
但请注意,直接使用 git 时要小心etckeeper
,如果您添加或删除文件,则/etc/.etckeeper
必须正确更新。如果您这样做,则会自动发生这种情况etckeeper commit
(不幸的是,它不支持任意提交作者),但如果您只是这样做则不会发生这种情况git commit
。
答案2
为了自动包含非 root 用户的配置文件,我使用别名bash
:
alias gsudo='sudo git -c "include.path='"${XDG_CONFIG_DIR:-$HOME/.config}/git/config\" -c \"include.path=$HOME/.gitconfig\""
然后我使用gsudo
而不是git
两者:
- 以 root 身份运行
- 有权访问所有非root用户的git配置
检查配置确实被导入:
gsudo config --list --show-origin --includes | less