重置/tmp值以推送Mercurial更改时遇到问题

3 投票
2 回答
1017 浏览
提问于 2025-04-16 16:18

我已经使用Mercurial大约一年了,一直没有遇到什么问题。

今天我第一次遇到了一个问题。

当我尝试用以下命令推送到远程服务器时:

$ hg push

我得到了以下回应:

searching for changes
remote: abort: No space left on device
abort: unexpected response: empty string

我在网上搜索了这个问题,发现这是一个已知的问题,并找到了Mercurial常见问题解答中的一段内容:

4.28. 我在推送时收到“没有剩余空间”或“磁盘配额超出”的错误

我在推送时收到“没有剩余空间”或“磁盘配额超出”的错误,但我在远程hg仓库所在的设备上有很多空间,或者根本没有配额限制。

这个问题可能是因为Mercurial使用/tmp(或者环境变量$TMPDIR、$TEMP或$TMP定义的某个目录)来解压从网络上收到的包。解压时可能会达到设备的限制。

当然,你可以在默认的shell配置文件中将$TMPDIR设置为远程的其他位置,但这可能会被Mercurial以外的其他进程使用。另一种解决方案是在远程的全局.hgrc中设置一个钩子。可以查看如何在推送时更改远程的临时目录的钩子设置说明。

我在我的/etc/mercurial/hgrc文件中创建了一个钩子,内容如下:

[hooks]
pre-serve.tmpdir = python:hgenviron.settmpdir

然后我应该创建hgenviron.py文件:

import os
#see http://docs.python.org/lib/module-tempfile.html
def settmpdir(ui, repo, hooktype, node=None, source=None, **kwargs):
        os.environ["TMPDIR"] = "/home/tmp"

我遇到的问题是,我不知道如何在Fedora中将这个文件添加到$PYTHONPATH

我的操作系统是Fedora 12 x86_64
我使用的是Python 2.6
我使用的是Mercurial 1.6.4

更新:

我刚刚将hgenviron.py添加到/usr/lib/python2.6/site-packages/hg/hgenviron.py,并且

PYTHONPATH=$PYTHONPATH:/usr/lib/python2.6/site-packages/hg/hgenviron.py
export PYTHONPATH 

/etc/profile.d中添加了一个.sh文件,同时在/etc/mercurial/中添加了钩子。

但是我仍然收到错误:

remote: abort: pre-serve.tmpdir hook is invalid (import of "hgenviron" failed) abort: 
no suitable response from remote hg!

2 个回答

1

如果你在解决PYTHONPATH的问题时遇到困难,可以直接指定hgenviron.py文件的位置。

pre-serve.tmpdir = python:/var/hg/hgenviron.py:settmpdir

注意,这里调用settmpdir时用的是:,而不是原例中的.

2

问题出在使用了错误的导入语句。正确的写法应该是 from hg import hgenviron

设置 PYTHONPATH 的方式取决于你想在哪里添加它。

/etc/profile.d 目录下,你可以找到一组在 bash 启动时运行的脚本。/etc/profile 是一个全局文件,它会调用这些脚本,并且里面有这样的注释:

# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc

# It's NOT good idea to change this file unless you know what you
# are doing. Much better way is to create custom.sh shell script in
# /etc/profile.d/ to make custom changes to environment. This will
# prevent need for merging in future updates.

/etc/profile 在 bash 环境加载时会被执行。对于每个用户来说,你可以编辑 ~/.bash_profile~/.bashrc(如果这些文件不存在,你可以自己创建)。这些脚本会在特定用户登录时运行。你应该仔细查看这些文件,以了解环境是如何创建和设置的。

你可以添加类似这样的内容:

PYTHONPATH=/home/tmp:$PYTHONPATH
export PYTHONPATH

撰写回答