apt-get更新仅针对特定存储库


108

当我添加PPA并想要安装其一些内容时,使用来重新更新我的所有apt列表是很烦人的apt-get update

而是只能同步给定存储库的内容吗?


1
从老谋深算的开始,你可以只使用add-apt-repository -u
特维诺

-u据我所知,在Ubuntu(15.x)Vivid上没有。
kenorb 2015年

@TreviñoWily联机帮助页中没有提及:manpages.ubuntu.com/manpages/wily/en/man1/…是否在其他地方进行了记录?
muru

@muru我认为必须修正,仅在上提及add-apt-repository --help。请打开一个错误,要求修复手册页。
特维诺

@Treviño@muru仅供参考,此-u功能自18.04起已删除。见askubuntu.com/questions/65245/...
wisbucky

Answers:


82

是的,apt-get可以做到,而且可以很好地做到这一点。

  1. 追加到 ~/.bash_funcs

    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
    }
  2. 追加到 ~/.bashrc

    if [ -f $HOME/.bash_funcs ]; then
    .  $HOME/.bash_funcs
    fi
  3. 追加到 ~/.bash_completion

    # 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
  4. 然后获取文件

    . ~/.bashrc
    . ~/.bash_completion
  5. 完成并开始射击

    update-repo <tab> <tab>

您可以使用bash-completion实现来更新单个ppa存储库,而不必更新整个apt源。


14
你应该打包这个。
PyRulez 2014年

3
您确定自动完成脚本可以正常工作吗?
2014年

1
当我点击Tab时,它显示update-repo _init_completion: command not found
kevy

2
仅供参考:我已使用从本文中获得的知识来建议添加apt-repository的选项以自动执行此操作。code.launchpad.net/~evarlast/software-properties/support-update/…–
Jay _silly_evarlast_ Wren,

2
@CiprianTomoiaga它被合并了,但是来源在这里:bazaar.launchpad.net/~evarlast/software-properties / ... 我希望它会在一个聪明的地方
周杰伦_silly_evarlast_雷恩

41

如果存储库是在目录的特定文件中配置的/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

我再次检查,但如果再要安装了与另一个仓库的一些未解决的依赖包(也主存档),这是行不通的
特维诺

1
您能否解释sourceparts配置中的“-”是什么意思?
Sajuuk

我认为sourceparts不应使用“-”只是一种虚假的方式来告诉。参见github.com/Debian/apt/blob/master/apt-pkg/sourcelist.cc#L313。我可能是错的,找不到合适的文档来解释'-'。
随机

12

Y PPA Manager带有一个称为的命令行工具update-ppa,可让您更新单个PPA。

例如:

sudo update-ppa ppa:nilarimogard/webupd8

另外,通过Y PPA Manager添加PPA时,PPA源会自动更新(仅适用于该PPA)。在将来的版本中,还将有一个GUI来手动更新单个PPA。

有关Y PPA Manager的更多信息,请点击这里


5
sudo add-apt-repository ppa:webupd8team/y-ppa-manager然后sudo apt-get update最后sudo apt-get install y-ppa-manager
-mchid

8

要更新特定的存储库,请使用-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配给期间。


3
我认为这会更新/path/to
John Bachir

@JohnBachir确实如此。
罗马

1

-u选项已在15.10中添加。从15.10到17.10,您可以用来-u仅自动更新要添加的特定存储库:

add-apt-repository -u my-ppa

愚蠢的是,man直到18.04 才添加了此选项(但已在中进行了记录add-apt-repository --help)。但是在18.04中,此功能已删除!(同样,不在中man,但您可以在中看到add-apt-repository --help)。

在18.04中,更新功能已更改apt-get update在之后始终执行完整操作add-apt-repository。该-u选项已被有效删除。它仍然保留旧式语法,但始终设置为options.update = False。在18.04中,您确实可以选择-n, --no-update,就像以前的行为一样。但这全有还是全无,自18.04起您就无法更新单个存储库。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.