apt-get update только для определенного репозитория


108

Когда я добавляю PPA и хочу установить часть его содержимого, довольно раздражает повторное обновление всего моего списка приложений, используя apt-get update.

Возможно ли вместо этого синхронизировать только содержимое данного репозитория?


1
Начиная с хитрости, вы можете просто использоватьadd-apt-repository -u
Тревиньо

На -uUbuntu (15.x) Vivid нет, насколько я могу судить.
Кенорб

@ Treviño Это не упомянуто на справочной странице Wily: manpages.ubuntu.com/manpages/wily/en/man1/… Задокументировано ли это где-нибудь еще?
Муру

@muru Я думаю, это нужно исправить, это только упомянуто add-apt-repository --help. Пожалуйста, откройте ошибку с просьбой исправить страницу руководства.
Тревиньо

@ Treviño @muru К вашему сведению, -uфункциональность была удалена с 18.04. См. Askubuntu.com/questions/65245/…
wisbucky

Ответы:


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>

Вы можете обновить один репозиторий ppa без необходимости обновления всего исходного кода apt с помощью bash-complete.


14
Вы должны упаковать это.
PyRulez

3
Вы уверены, что скрипт автозаполнения работает?
Qed

1
Когда я нажимаю Tab, это показываетupdate-repo _init_completion: command not found
kevy

2
К вашему сведению: я использовал знания, полученные из этого поста, чтобы предложить опцию add-apt-repository, чтобы сделать это автоматически. code.launchpad.net/~evarlast/software-properties/support-update/…
Джей _silly_evarlast_ Рен

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

Я проверил это снова, но это не работает, если вы хотите установить пакет, который имеет некоторую неразрешенную зависимость от другого хранилища (также в основном архиве)
Treviño

1
Можете ли вы объяснить, что означает «-» в конфигурации исходных текстов?
Саджук

Я думаю, что «-» просто глупый способ сказать, 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

Кроме того, при добавлении PPA через Y PPA Manager источник PPA автоматически обновляется (только для этого PPA). В будущей версии также будет графический интерфейс для ручного обновления отдельных 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="{}" ';'

Это гораздо быстрее, чем обновление всех репозиториев, особенно во время подготовки виртуальной машины после добавления новых.


3
Я думаю, что это обновляет все найденное в/path/to
Джон Бачир

@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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.