我可以基于每个项目缓存git凭据吗?

Sum*_*ai8 13 git credentials

有几个人正在通过网络共享在单个Web服务器上处理多个项目.每个项目都有自己的git存储库.在启动项目时,我们为每个开发项目的开发人员和每个项目的临时环境提供个人开发环境.所有文件都归www-data,因为这是Apache使用的用户.

为了防止我们在拉,推和切换到新分支时多次输入我们的用户名和密码,我们目前正在使用凭证缓存(如此处所示).

$ git config --global credential.helper
cache --timeout=900
Run Code Online (Sandbox Code Playgroud)

我们面临的问题是当某人(用户1)执行经过身份验证的git操作时,他们会输入他们的凭据.在超时内,其他人(用户2)在他们自己的存储库中执行经过身份验证的git操作,该存储库使用用户1的凭据.这将导致以下两种情况之一发生:

  • 用户2收到存储库不存在的错误.这是因为用户1没有权限对用户2的存储库执行操作.
  • 用户2使用用户1的帐户推送提交(作为作者).推送显示在用户1的历史记录中.

我认为通过将用户名添加到git存储库url(例如username@git.domain.ext/repo/name.git)可以部分缓解此问题,但这仅适用于我们每个用户拥有个人开发环境的开始阶段.登台环境需要多人访问,因此我们无法对用户名进行硬编码.在我们完成初始开发并且项目已经投入使用之后,我们清理了开发环境,因为我们没有无限的空间.如果我们在清理个人开发环境后需要进行更改,我们通常会使用暂存环境来执行此操作,这会导致同样的问题发生.

git config --global credential.helper命令导致凭据在服务器范围内存储.降低超时只会有很大帮助.我们可以缓存每个开发环境的凭据吗?

Nat*_*eks 7

我找不到与您完全匹配的选项,因此我写了一个:git凭证帮助程序,它基于每个shell存储凭据.

它为登录时的数据设置临时加密密钥和临时目录,使用它们store凭证帮助程序进程的阶段存储git给出的用户名和密码,然后在get阶段中返回.

注意事项:

  1. 我测试了它,但只是以相当有限的方式.它可以工作:同一用户的两个单独的登录shell可以具有单独的缓存凭据.
  2. 这很天真:在存储和检索凭据时,它会忽略git给出的任何用户名和repo URL.
  3. 它将留下一个临时目录,每个登录都有一些小文件.
  4. 它存储加密的凭证,但我没有声称它在实践中有多安全.
  5. 它需要Python 3.6,pycrypto和bash; 我在linux和macOS上测试过它.适应其他设置应该相当容易.

如果遇到任何麻烦,请打开一个问题,我会看到我能做些什么.


Sum*_*ai8 6

部分问题可以通过使用来解决git config --global credential.useHttpPath true。它消除了存储库不存在的错误,因为我们没有有权拉取存储库但无权推送它的人。不过,在不同目录中使用同一存储库的两个人仍然可能会意外地以另一个用户的身份进行推送。

当您从事可以轻松播种的项目时,Eis的回答是可靠的建议。就我而言,很多项目都不容易播种,这使得它成为不太理想的解决方案。

Nathan的答案可能是最简洁的解决方案,并且可能比以下解决方案适用于更广泛的系统。


就我而言,我决定采用受VonC启发的方法。git-credential-cache允许两个参数,即timeout参数和socket参数。我们目前只使用 bash,它公开$BASHPID包含当前 shell 的 pid 的变量。遗憾的是,我们不能直接在配置值中使用该变量,但使用 VonC 的建议来隐藏 git 命令,我们可以创建一个别名。

~/.bashrc我在www-data 用户的文件中添加了一行并添加:

alias git="/usr/bin/git -c credential.helper='cache --timeout=7200 --socket=/var/www/.git-credential-cache/socket_$BASHPID'"
Run Code Online (Sandbox Code Playgroud)

注意:socket需要是绝对路径,并且用户的主目录www-data恰好是/var/www/

我已经删除了全局凭据助手配置,如下所示:

git config --global --unset credential.helper
Run Code Online (Sandbox Code Playgroud)

现在,每个 bash shell 使用单独的套接字。这种方法的好处是它仍然使用 git 附带的缓存机制,这意味着它可能不会很快被破坏。缺点是隐藏命令会引入神奇的行为(配置中没有设置任何内容,但无论如何它都会工作......如何?),这可能会在将来让同事感到困惑。


Meh*_*hdi 5

以下是您的问题的两种可能解决方案:

1 - 每个开发人员有一个操作系统用户。

这是更干净的选择:每个开发人员都将连接到不同的用户帐户。将这些用户添加到组www-data并相应地设置文件选项:允许组成员读取和写入。

然后将独立管理每个用户的身份验证。

2 - 存储每个项目的配置

目前,--global用户凭据的存储是在操作系统用户级别完成的。相反,您可以使用--local, 以便在项目级别存储凭据。

这将解决用户 1 和用户 2 之间所描述的问题。 但是,您仍然可能缺乏这种方式的一些可追溯性:如果两个开发人员在同一个项目上工作,如果用户 2 在用户 1 之后不久推送一些更改,将使用用户 1 的身份验证详细信息,看起来她是执行推送的人 - 而它是 user2。

阅读git config --help有关 --local 选项和数据存储位置的详细信息。