只针对特定的软件源进行apt-get update。

当我添加一个PPA并且想要安装其中的一些内容时,重新更新所有apt列表使用apt-get update是相当烦人的。
相反,是否有可能只同步给定仓库的内容?

1从机智的角度出发,你可以直接使用add-apt-repository -u命令。 - Treviño
据我所知,Ubuntu(15.x)Vivid上没有-u选项。 - kenorb
@Treviño 在Wily的manpage中没有提到:http://manpages.ubuntu.com/manpages/wily/en/man1/add-apt-repository.1.html 它在其他地方有文档吗? - muru
@muru 我认为这个问题需要修复,它只在 add-apt-repository --help 中提到。请提交一个错误报告,要求修复 manpage。 - Treviño
@Treviño @muru FYI,自18.04版本起,-u功能已被移除。请参考https://askubuntu.com/questions/65245/apt-get-update-only-for-a-specific-repository/1132852#1132852 - wisbucky
6个回答

是的,apt-get可以做到这一点,并且可以以一种很好的方式完成。
将以下内容添加到~/.bash_funcs中:
```bash update-repo() { for source in "$@"; do sudo apt-get update -o Dir::Etc::sourcelist="sources.list.d/${source}" \ -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0" done } ```
将以下内容添加到~/.bashrc中:
```bash if [ -f $HOME/.bash_funcs ]; then . $HOME/.bash_funcs fi ```
将以下内容添加到~/.bash_completion中:
```bash # Debian user-defined completion -*- shell-script -*-
_ppa_lists(){ local cur _init_completion || return
COMPREPLY=( $( find /etc/apt/sources.list.d/ -name "*$cur*.list" \ -exec basename {} \; 2> /dev/null ) ) return 0 } && complete -F _ppa_lists update-repo ```
然后执行以下命令使文件生效:
```bash . ~/.bashrc . ~/.bash_completion ```
完成后,可以开始使用以下命令:
```bash update-repo ```
你可以使用bash-completion来更新单个ppa仓库,而无需更新整个apt源。

如果存储库在目录/etc/apt/sources.list.d/中的特定文件(例如myrepo.list)中进行配置,您可以使用以下命令更新该单个存储库:
sudo apt-get update -o Dir::Etc::sourcelist="sources.list.d/myrepo.list" \
    -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"

尽管如此,这并不是很方便。
可以通过定义一个bash函数来简化这个过程。
update_repo() {
    sudo apt-get update -o Dir::Etc::sourcelist="sources.list.d/$1.list" \
        -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
}

为了让你能够简单地运行
update_repo myrepo

我再次检查了一遍,但如果您想安装某个其他存储库(也在主要归档中)上具有未解决依赖项的软件包,则无法正常工作。 - Treviño
1你能解释一下在sourceparts配置中'-'代表什么意思吗? - Sajuuk
我认为“-”只是一种告诉sourceparts不应该被使用的虚拟方式。请参考https://github.com/Debian/apt/blob/master/apt-pkg/sourcelist.cc#L313。尽管如此,我可能是错的,找不到一个合适的文档来解释“-”。 - randomness2077

Y PPA Manager带有一个命令行工具,名为update-ppa,它允许您更新单个PPA。
例如:
sudo update-ppa ppa:nilarimogard/webupd8

此外,当通过Y PPA Manager添加PPA时,PPA源会自动更新(仅限于该PPA)。在将来的版本中,也会有一个图形界面来手动更新单个PPA。
关于Y PPA Manager的更多信息,请点击这里

6使用以下命令:sudo add-apt-repository ppa:webupd8team/y-ppa-manager,然后执行 sudo apt-get update,最后运行 sudo apt-get install y-ppa-manager - mchid

要更新特定的存储库,请使用-o,例如:
apt-get update -o Dir::Etc::sourcelist=/path/to/repo.list

这是一个一行代码,仅更新最近添加的apt软件源。
find /etc/apt/sources.list.d -type f -name '*.list' -exec sudo apt-get update -o Dir::Etc::sourcelist="{}" ';'

这比更新所有存储库要快得多,特别是在添加新的虚拟机后进行VM配置时。

4我认为这个更新包含了在/path/to路径下找到的所有内容。 - John Bachir
@JohnBachir 没错。 - Roman

在15.10版本中添加了-u选项。从15.10到17.10,您可以使用-u来自动更新您正在添加的特定存储库:

add-apt-repository -u my-ppa

可笑的是,直到18.04版本才将此选项添加到man中(但在add-apt-repository --help中有记录)。但在18.04中,这个功能被移除了!(同样,在man中没有说明,但您可以在add-apt-repository --help中看到)。

在18.04版本中,更新功能已更改为在add-apt-repository之后始终执行完整的apt-get update-u选项已被有效移除,但仍保留用于旧语法,且始终设置为options.update = False。在18.04版本中,您可以选择使用-n, --no-update选项,以实现与旧行为相似的效果。但这是全局设置,无法单独更新某个存储库自18.04版本起。

也可以将可用选择减少到一个单一的存储库:

echo "deb http://archive.ubuntu.com/ubuntu/ focal universe" > /etc/apt/sources.list
apt-get update -y && apt-get install -y ncftp

这可能有点激进,但在单次使用的容器中运行apt-get可以节省时间和流量。
如果你不知道什么是单次使用的容器,请在投票之前先了解一下...
因为这是一个正确且功能性的答案,它能够实际地达到目的(节省时间)。