
Ich habe anscheinend versehentlich das System76-PPA für Pop!_OS zu meiner Ubuntu 20.04-Installation hinzugefügt. (Was wirklich seltsam ist, ist, dass ich das nicht bemerkt habe ...)
Inzwischen habe ich das PPA und die Einträge in der Liste der Repos, die ich finden konnte, entfernt. Das System ist fast wieder im Normalbetrieb. Trotzdem denke ich, dass noch Reste übrig sind, zumindest interpretiere ich die folgende Ausgabe so:
$ apt list --installed | grep pop[0-9]
accountsservice/now 0.6.55-0ubuntu13.2pop0~1605745773~20.04~d9482b1 amd64 [installed,local]
gnome-settings-daemon-common/now 3.36.1-0ubuntu1pop0~1596026424~20.04~8296153 all [installed,local]
gnome-terminal-data/now 3.36.2-1ubuntu1~20.04pop0~1594780610~20.04~8048ed7 all [installed,local]
gnome-terminal/now 3.36.2-1ubuntu1~20.04pop0~1594780610~20.04~8048ed7 amd64 [installed,local]
...
Wie finde ich nun heraus, zu welchem Repo diese gehören und wie führe ich ein Downgrade dieser Pakete auf die Version durch, die in den aktuell aktiven Repositories enthalten ist?
Ich sehe zum Beispiel:
$ apt policy gnome-settings-daemon-common
gnome-settings-daemon-common:
Installed: 3.36.1-0ubuntu1pop0~1596026424~20.04~8296153
Candidate: 3.36.1-0ubuntu1pop0~1596026424~20.04~8296153
Version table:
*** 3.36.1-0ubuntu1pop0~1596026424~20.04~8296153 100
100 /var/lib/dpkg/status
3.36.1-0ubuntu1 500
500 http://xx.archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages
500 http://xx.archive.ubuntu.com/ubuntu focal-updates/main i386 Packages
3.36.0-1ubuntu2 500
500 http://xx.archive.ubuntu.com/ubuntu focal/main amd64 Packages
500 http://xx.archive.ubuntu.com/ubuntu focal/main i386 Packages
Und:
$ apt-cache madison gnome-settings-daemon-common
gnome-settings-daemon-common | 3.36.1-0ubuntu1 | http://xx.archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages
gnome-settings-daemon-common | 3.36.1-0ubuntu1 | http://xx.archive.ubuntu.com/ubuntu focal-updates/main i386 Packages
gnome-settings-daemon-common | 3.36.0-1ubuntu2 | http://xx.archive.ubuntu.com/ubuntu focal/main amd64 Packages
gnome-settings-daemon-common | 3.36.0-1ubuntu2 | http://xx.archive.ubuntu.com/ubuntu focal/main i386 Packages
gnome-settings-daemon | 3.36.0-1ubuntu2 | http://xx.archive.ubuntu.com/ubuntu focal/main Sources
gnome-settings-daemon | 3.36.1-0ubuntu1 | http://xx.archive.ubuntu.com/ubuntu focal-updates/main Sources
Ich interpretiere dies als Hinweis darauf, dass die aktuell installierte Version nicht in den Repos enthalten ist.
Aber wie kann ich die Version im Repository zurücksetzen? Idealerweise würde ich das gerne fürallePakete...
AKTUALISIERENIch habe nun alle Pakete manuell durch die gewünschten ersetzt, indem ich verwendet habe apt-get install package=version
. Das war sehr mühsam, weil ich für jedes Paket die benötigte Version nachschlagen apt policy
und manchmal eine ganze Reihe von Paketen auf einmal ersetzen musste, um Abhängigkeiten zu erfüllen. Obwohl mein Problem gelöst ist, bin ich daher immer noch sehr daran interessiert, wie eine solche Bereinigung effizienter durchgeführt werden könnte.
Antwort1
Bei all der mühsamen manuellen Aufräumarbeit habe ich am Ende auch ein Python-Skript geschrieben, das alle Pakete identifiziert, die sich entweder nicht in den aktiven Repositories befinden oder für die neuere Versionen als die in den Repositories installiert sind.
Der folgende Code ist eine schnelle Lösung und wird keinen Schönheitswettbewerb gewinnen, aber bei mir hat er funktioniert.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Identify all packages that are not in active repositories or for
which newer versions are installed.
"""
import re
import subprocess
from pprint import pprint
def get_packages():
vers = subprocess.run("apt-show-versions", shell=True, capture_output=True)
vers = vers.stdout.decode("utf-8").splitlines()
vers = [y for y in (x.strip() for x in vers) if y]
not_in_archive = {}
newer_than_archive = {}
others = {}
for pkg in vers:
p = [x.strip() for x in pkg.split(' ', 2)]
name = p[0]
vers = p[1]
status = p[2] if len(p) == 3 else ''
if vers == 'not' and status == 'installed':
continue
if status == 'uptodate':
continue
tmp = {name: {'vers': vers}}
if status == 'installed: No available version in archive':
not_in_archive.update(tmp)
elif status == 'newer than version in archive':
newer_than_archive.update(tmp)
else:
others.update(tmp)
others[name][status] = status
return not_in_archive, newer_than_archive, others
def get_version(pkg):
vers = subprocess.run("apt policy {}".format(pkg),
shell=True, capture_output=True)
vers = vers.stdout.decode("utf-8").splitlines()
vt = re.compile(r'^ +version table:', re.IGNORECASE)
stars = re.compile(r'^ \*\*\* *')
res = []
while True:
line = vers.pop(0)
if vt.match(line):
break
for i, line in enumerate(vers):
if line[:8].strip():
s = line[:5]
v = line[5:].split(' ', 1)[0]
installed = bool(stars.match(s))
else:
p, a = line[8:].split(' ', 1)
res.append({'installed': installed,
'version': v,
'prio': p,
'archive': a})
return res
if __name__ == '__main__':
missing, newer, rest = get_packages()
url = re.compile(r'^https?://', re.IGNORECASE)
res = {}
for p in newer:
v = get_version(p)
for x in v:
if url.match(x['archive']):
res[p] = x['version']
break
if missing:
print("===== packages not in repositories =====")
print(' '.join(p for p in missing))
print()
if rest:
print("===== packages with other status =====")
pprint(rest)
print()
if res:
print("===== command to downgrade =====")
print('sudo apt-get install {}'.format(
' '.join('{}={}'.format(p, v) for p, v in res.items())))
Nachdem ich beispielsweise meine Darktable- und Kicad-PPAs deaktiviert habe, erhalte ich
===== packages not in repositories =====
darktable-dbg:amd64 libpng12-0:amd64 zoom:amd64
===== command to downgrade =====
sudo apt-get install darktable:amd64=3.0.1-0ubuntu1 kicad:amd64=5.1.5+dfsg1-2build2 kicad-demos:all=5.1.5+dfsg1-2build2 kicad-doc-en:all=5.1.5+dfsg1-2build2 kicad-footprints:all=5.1.5-1 kicad-libraries:all=5.1.5+dfsg1-2build2 kicad-packages3d:all=5.1.5-1 kicad-symbols:all=5.1.5-1 kicad-templates:all=5.1.5-1
Der letzte Befehl würde die installierten Pakete herabstufen und die oben genannten müssten mit entfernt werden apt-get remove ...
.
(Ich verstehe, dass ppa-purge die richtige Methode ist, wenn es nur darum geht, ein PPA zu entfernen und alles andere im System „sauber“ ist, aber das muss nicht immer der Fall sein.)