Comment puis-je rétrograder des packages sans supprimer leurs dépendants?

17

J'ai un certain nombre de packages mesa que j'avais mis à niveau vers une version PPA, avant de purger le PPA afin de pouvoir mettre à niveau mon système. Les différences dans les versions sont mineures (elles sont techniquement les mêmes, un seul ensemble de bibliothèques provient de git et les autres sont les versions finales).

Si j'essaie de rétrograder via Synaptic, apt-get ou aptitude, je suis jeté dans l'enfer des dépendances.

Existe-t-il un moyen de rétrograder manuellement les packages (peut-être un par un) et de marquer leurs packages dépendants comme inamovibles (si cela a du sens) jusqu'à ce que j'aie terminé?

PS cette question: comment rétrograder un package via apt-get? est un peu différent et n'aide pas cette situation.

RolandiXor
la source
Pourquoi tu ne le fais pas d' ppa-purgeabord?
landroni
Vous pouvez réinstaller le package.Par exemple, si vous utilisez synaptic, lorsque vous sélectionnez le package xyz, toutes les dépendances seront sélectionnées par défaut.Mais vous pouvez toujours désélectionner toutes les dépendances et simplement installer le package principal.Plus tard, vous pouvez installer toutes les dépendances.Mais encore une fois, cela ne fonctionne que si vous êtes prêt à réinstaller.
Utilisateur enregistré le
@landroni si je purge, cela supprimera les paquets que je ne veux pas supprimer.
RolandiXor

Réponses:

13

Je n'ai jamais joué avec cela auparavant, mais je vous suggère hold(ou lock) la version des dépendances qui vous causent des problèmes. De cette façon, le aptnombre de solutions possibles est plus limité et ne se confond peut-être pas lorsque vous essayez de rétrograder les autres packages.


Si rien d'autre ne fonctionne, vous pouvez adopter l'approche manuelle suggérée dans cette réponse: Comment rétrograder un package via apt-get? . Fondamentalement, télécharger les nécessaires .debpaquets manuellement, les installer un par un à l' aide du niveau inférieur dpkget un de ses solides arguments: --ignore-depends, --force-depends, --force-depends-version, ou même --force-all.

Dans le même esprit que ci-dessus, vous avez l' --force-downgradeargument:

          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.

Mais cela suppose que vous avez lu man dpkget que vous comprenez ce que vous faites:

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

Voir Erreur: le numéro de version ne commence pas par chiffre et Comment installer une ancienne version de Java et Comment installer une ancienne version de package comme le liquide 2.2.2? pour des exemples de:

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

Et voir Comment puis-je installer un package sans installer certaines dépendances? pour un exemple (avec l'avertissement approprié) de:

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

Une autre approche serait de créer un .debpaquet factice en utilisant le equivspaquet (et peut-être un nom légèrement différent). L'installation du package factice devrait alors vous permettre de supprimer le "vrai" package tout en conservant les dépôts appropriés, puis d'installer l'ancienne version. Je ne sais pas exactement comment cela fonctionnerait, mais consultez ce fil pertinent pour plus de détails: Comment supprimer un deb sans supprimer ses dépendances .

landroni
la source
4

Vous pouvez d'abord utiliser apt-markpour marquer toutes les dépendances du package cible (et peut-être aussi celles recommandées / suggérées) installées dans le système en tant qu'installations manuelles . Après cela, installez les versions précédentes du logiciel en apt-getmentionnant explicitement la version.

  • Pour répertorier les dépendances, les packages recommandés et suggérés pour le package cible:

    apt-cache show <target-package-name>
    
  • Marquage des packages comme installés manuellement :

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

    (utilisez ceci pour toutes les dépendances, recommande et suggère.)

  • Supprimez le package cible:

    sudo apt-get remove <target-package-name>
    
  • Pour afficher une liste des versions de packages que vous pouvez rétrograder / mettre à niveau, utilisez:

    apt-cache policy <target-package-name>
    
  • Installez la version cible du package requis:

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

    ou

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

PS. Si la liste des dépendances / packages recommandés / suggérés , c'est-à-dire ceux qui doivent être marqués avec, apt-markest grande, enregistrez la liste prévue de la sortie empaquetée par apt-cache show <target-package-name>dans n'importe quel fichier /path/to/fooet utilisez le apt-markdans un combo comme celui-ci:

cat /path/to/foo | xargs -imarkthese sudo apt-mark manual markthese
précis
la source
Cette méthode peut fonctionner, mais au lieu de marquer plus de 100 paquets, je suis juste allé avec l'autre réponse.
RolandiXor
@RolandiXor, vous pouvez utiliser apt-cache policy <target-package-name>pour avoir une liste des versions de packages que vous pouvez rétrograder / mettre à niveau vers ..
précis
..s'il vous plaît renvoyer la modification effectuée au poste; si un plus grand nombre de fichiers doit être marqué, vous pouvez utiliser le combo de commandes inclus ...
précis
Je ne pense pas que tu me comprennes. Quoi qu'il en soit, je l'ai réparé maintenant et j'ai distribué la prime (je ne peux pas l'échanger).
RolandiXor
1

Je viens de traverser la douleur de la mise à niveau vers une version en amont d'un package, puis de décider de rétrograder. C'était via un référentiel privé des mainteneurs. Dans mon cas, il s'agissait d'essayer la dernière version de systemd 233 (encore inédite).

La clé est de comprendre que vous devez spécifier tous les packages qui doivent être rétrogradés. Si vous réussissez, les chances sont bonnes de faire ce que vous voulez. Si vous manquez quelque chose, apt vous indiquera que l'action entraînera la suppression de nombreux packages. Pour nous assurer que nous utilisons l'indicateur «-s» pour essayer la rétrogradation avant de le faire.

Les étapes à suivre sont donc les suivantes:

1) Énumérez toutes les dépendances qui ont été mises à niveau vers l'amont (utilisez un autre mot-clé si votre situation est différente):

dpkg -l|grep upstream

Cela vous donne une liste de packages avec un numéro de version en amont.

2) Indiquez la version stable correcte pour chaque package:

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) Vérifiez que tout est bon:

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.

(je ne sais pas si --reinstall était requis entre autres, mais c'est ce que j'ai fait)

4) Retirez le -s et faites-le.

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
la source