Как я могу понизить версию пакетов, не удаляя их иждивенцев?

17

У меня есть несколько меза пакетов, которые я обновил до версии PPA, прежде чем очистить PPA, чтобы я мог обновить свою систему. Различия в версиях незначительны (технически они одинаковы, только один набор библиотек был из git, а остальные - окончательные версии).

Если я попытаюсь понизить рейтинг через Synaptic, apt-get или aptitude, я попаду в ад зависимости.

Есть ли способ понизить пакеты вручную (возможно, один за другим) и пометить их зависимые пакеты как неподвижные (если это имеет смысл), пока я не закончу?

PS этот вопрос: как понизить пакет через apt-get? немного отличается и не помогает в этой ситуации.

RolandiXor
источник
Почему ты не ppa-purgeпервый?
Landroni
Вы можете переустановить synapticпакет. Например, если вы используете , когда вы выбираете пакет xyz, все зависимости будут выбраны по умолчанию. Но вы всегда можете отменить выбор всех зависимостей и просто установить основной пакет. Позже вы можете установить все зависимости. Но снова, это работает, только если вы готовы переустановить.
Зарегистрированный пользователь
@landroni, если я произвожу чистку, он удалит пакеты, которые я не хочу удалять.
RolandiXor

Ответы:

13

Я никогда не играл с этим раньше, но я бы предложил вам hold(или lock) версию зависимостей, которые доставляют вам неприятности. Этот способ aptимеет более ограниченное число возможных решений и, возможно, не запутается, когда вы попытаетесь понизить версию других пакетов.


Если больше ничего не работает, вы можете воспользоваться ручным подходом, предложенным в этом ответе: Как понизить пакет через apt-get? , В основном, скачать необходимые .debпакеты вручную, а затем установить их по одному с помощью более низкого уровня dpkgи один из его аргументов насильственных: --ignore-depends, --force-depends, --force-depends-version, или даже --force-all.

В том же духе, что и выше, у вас есть --force-downgradeаргумент:

          downgrade(*): Install a package, even if newer version of
          it is already installed.

          Warning:  At  present  dpkg  does  not  do any dependency
          checking on downgrades and therefore will not warn you if
          the  downgrade  breaks the dependency of some other pack‐
          age. This can  have  serious  side  effects,  downgrading
          essential system components can even make your whole sys‐
          tem unusable. Use with care.

Но это предполагает, что вы прочитали man dpkgи понимаете, что делаете:

          Warning: These options are mostly intended to be used  by
          experts  only.  Using  them  without  fully understanding
          their effects may break your whole system.

См. Ошибка: номер версии не начинается с цифры и Как установить более старую версию Java и Как установить более старую версию пакета, например, Liquid 2.2.2? для примеров:

sudo dpkg --force-downgrade -i your_mesa_package.deb

И посмотрите, как я могу установить пакет без установки некоторых зависимостей? например (вместе с соответствующим предупреждением):

sudo dpkg --force-all -i your_mesa_package.deb

Еще один подход заключается в создании фиктивного .debпакета с использованием equivsпакета (и, возможно, немного другого имени). Затем установка фиктивного пакета должна позволить вам удалить «истинный» пакет, сохраняя при этом соответствующие deps, а затем установить более старую версию. Я не уверен, как именно это будет работать, но посмотрите подробности в этой теме: Как удалить deb, не удаляя его зависимости .

landroni
источник
4

Вы можете сначала использовать, apt-markчтобы пометить все зависимости целевого пакета (и, возможно, также рекомендованные / предложенные), установленные в системе, при ручной установке. После этого установите предыдущие версии программного обеспечения с apt-getявным указанием версии.

  • Чтобы получить список зависимостей, рекомендуемых и предлагаемых пакетов для target-package:

    apt-cache show <target-package-name>
    
  • Пометка пакетов как установленных вручную :

    sudo apt-mark manual <package-name(s)>
    

    (используйте это для всех зависимостей, рекомендует и предлагает.)

  • Удалить целевой пакет:

    sudo apt-get remove <target-package-name>
    
  • Чтобы увидеть список версий пакетов, которые вы можете понизить / обновить, используйте:

    apt-cache policy <target-package-name>
    
  • Установите целевую версию необходимого пакета:

    sudo apt-get install <target-package-name>=<target-package-version-number> 
    

    или

    sudo apt-get -t=<target release> install <target-package-name>
    

PS. Если список зависимостей / рекомендуемых / предлагаемых пакетов, т. Е. Тех, которые должны быть помечены, apt-markявляется большим, сохраните предполагаемый список упакованных выходных данных apt-cache show <target-package-name>в любом файле, скажем, /path/to/fooи используйте apt-markкомбо в виде:

cat /path/to/foo | xargs -imarkthese sudo apt-mark manual markthese
точный
источник
Этот метод может работать, но вместо того, чтобы отмечать более 100 пакетов, я просто выбрал другой ответ.
RolandiXor
@RolandiXor, вы можете использовать apt-cache policy <target-package-name>для получения списка версий пакетов, которые вы можете понизить / обновить до ..
точно
.. пожалуйста, отошлите изменения, внесенные в пост; если нужно пометить большее количество файлов, вы можете использовать комбо-команду, включенную ...
точно
Я не думаю, что ты меня понимаешь. В любом случае, я исправил это и выдал награду (не могу ее поменять).
RolandiXor
1

Я только что прошел через боль в процессе обновления до версии пакета, выпущенной в апстриме, а затем решил перейти на более раннюю версию. Это было через частный репозиторий сопровождающих. В моем случае это все о том, чтобы опробовать последнюю версию systemd 233 (пока не выпущенную).

Ключ должен понимать, что вам нужно указать все пакеты, которые должны быть понижены. Если вы поймете это правильно, скорее всего, вы будете делать то, что хотите. Если вы что-то пропустите, apt скажет вам, что это действие приведет к удалению большого количества пакетов. Чтобы убедиться, что мы используем флаг '-s', чтобы попробовать понизить версию, прежде чем делать это.

Шаги, которые вам нужно предпринять, следующие:

1) Перечислите все зависимости, которые были обновлены до восходящего (используйте другое ключевое слово, если ваша ситуация отличается):

dpkg -l|grep upstream

Это дает вам список пакетов с вышестоящим номером версии.

2) Перечислите правильную стабильную версию для каждого пакета:

for i in libnss-resolve:amd64 libsystemd0:amd64 libpam-systemd:amd64 libsystemd0:i386 libudev1:amd64 libudev1:i386 systemd systemd-sysv udev; do apt-cache show $i; done|grep Version

3) Дважды проверьте все хорошо:

apt -s --allow-downgrades --no-remove --reinstall install libnss-resolve:amd64=232-21ubuntu5 libsystemd0:amd64=232-21ubuntu5 libpam-systemd:amd64=232-21ubuntu5 libsystemd0:i386=232-21ubuntu5 libudev1:amd64=232-21ubuntu5 libudev1:i386=232-21ubuntu5 systemd=232-21ubuntu5 systemd-sysv=232-21ubuntu5 udev=232-21ubuntu5

0 to upgrade, 0 to newly install, 9 to downgrade, 0 to remove and 0 not to upgrade.

(не уверен, что --reinstall был необходим, кстати, но это то, что я сделал)

4) Удалите -s и сделайте это.

apt --allow-downgrades --no-remove --reinstall install libnss-resolve:amd64=232-21ubuntu5 libsystemd0:amd64=232-21ubuntu5 libpam-systemd:amd64=232-21ubuntu5 libsystemd0:i386=232-21ubuntu5 libudev1:amd64=232-21ubuntu5 libudev1:i386=232-21ubuntu5 systemd=232-21ubuntu5 systemd-sysv=232-21ubuntu5 udev=232-21ubuntu5
user2427436
источник