【问题标题】:Git pulling depends on the current dirGit 拉取依赖于当前目录
【发布时间】:2012-04-08 17:56:32
【问题描述】:

我正在尝试通过 root 用户从任何目录git pull 某个存储库。

例如,从/root/执行git pull

#> cd ~
#> sudo -u dmalikov git --git-dir=/home/dmalikov/path/to/repo/.git pull 
/usr/libexec/git-core/git-sh-setup: line 142: cd: /root/.: Permission denied
Cannot chdir to /root/., the toplevel of the working tree

并从/ 执行git pull

#> cd /
#> sudo -u dmalikov git --git-dir=/home/dmalikov/path/to/repo/.git pull 
Already up-to-date.

为什么当前目录会影响git pulling 命令?

如何避免多余的cd

【问题讨论】:

  • /root 是你仓库中的文件夹吗?如果是,您不应该有权限问题。如果 /root 在您的 git 结构之外,那么需要问的问题是它为什么首先访问该文件夹?
  • 你为什么要以 root 身份工作?
  • 我正在尝试使用 root,因为它是 eix-sync.conf 的内容。

标签: git git-pull


【解决方案1】:

在您的第一个示例中,git 命令以用户 dmalikov 的身份运行,当前目录为 /root。由于git pull 命令等同于git fetch 后跟git merge,并且由于git merge 在工作树上运行,git 尝试寻找工作树。由于该用户没有cd /root的权限,所以git命令失败。

即使您的第二个示例也无法按您的预期工作。如果要提取实际更改(而不是“已更新”),则 git pull 将失败,因为它找不到工作树。

您有几个简单的选择:

1) 您可以通过以下方式完成操作的git fetch 部分:

sudo -u dmalikov git --git-dir=/home/dmalikov/path/to/repo/.git fetch

这对我来说没有任何错误。

2) 您可以将cd 添加到工作树:

(cd /home/dmalikov/path/to/repo; sudo -u dmalikov git pull)

【讨论】:

【解决方案2】:

为了回答我自己的评论,/root 是一个有趣的错误

要让它与 --git-dir 一起工作,你还需要指定一个工作树目录

sudo -u dmalikov git --git-dir=/home/dmalikov/path/to/repo/.git --work-tree=/home/dmalikov/path/to/repo/.git pull

【讨论】:

  • fatal: Could not change back to '/root': Permission denied
  • 你在什么机器上?它将使用您的系统(Windows 或 linux)特定路径。以下适用于我的本地机器(Windows 上的 git bash)$ git --git-dir=/c/workspace/changes/.git --work-tree=/c/workspace/changes/ pull Already up-to-date.
  • 尝试从目录执行你的命令,你不能通过非root用户cd
【解决方案3】:

我认为当您使用无权将目录更改回当前目录(即 /root)的用户运行 git 时,无法避免该 cd。 / 作为当前目录显然可以工作,因为每个人都有权更改到该目录。

【讨论】:

  • fatal: Could not change back to '/root': Permission denied
  • 改变了我的答案。它与权限有关,而不是我最初认为的 --work-tree。
猜你喜欢
  • 2018-09-29
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 2017-08-03
  • 2017-04-30
相关资源
最近更新 更多