Stellen Sie apt-get-Optionen ein, um harmlosen "dpkg --force-Konflikt" -Kludge zu tolerieren?


7

Ein trivial widersprüchliches Paket foo kann durch Ausführen dazu gebracht werden, mit bar zu arbeiten dpkg --force-conflicts -i foo. Aber irgendwann ist es Zeit für ein Upgrade und 'apt-get'-Objekte:

% apt-get upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
You might want to run 'apt-get -f install' to correct these.
The following packages have unmet dependencies:
 foo : Conflicts: bar but 0.2-1 is installed
E: Unmet dependencies. Try using -f.

Kann apt-get optimiert / gezwungen werden, den (ziemlich festen) Konflikt zu tolerieren und dann zu aktualisieren?

(Quickie Existenzbeweis: uninstall foo , dann aktualisieren, installieren Sie dann foo wie vor Deshalb ist es. Ist möglich, ist die Frage nach dem geringsten Aufwand Mechanismus zu finden.)


Ein Beispiel, aber bei dieser Frage geht es nicht um zwei bestimmte Pakete.

Seit einigen Jahren hat GNU parallel einen trivialen Konflikt mit Moretutils ; jedes bietet / usr / bin / parallel . dpkg kann das Zusammenleben erzwingen:

# assume 'moreutils' is already installed, and 'parallel' is in
# apt's cache directory.
dpkg --force-conflicts -i /var/cache/apt/archives/parallel_20141022+ds1-1_all.deb

Dadurch wird eine Umleitung erstellt und die moreutils- Version in /usr/bin/parallel.moreutils umbenannt . Beide Programme funktionieren, bis der Benutzer ein Upgrade durchführt.

Ich habe eine -o- Option ausprobiert , aber das hat keinen Frieden gebracht:

apt-get -o Dpkg::Options::="--force-conflicts" install parallel moreutils

Mögliche -o Optionen sind jedoch Hunderte ...


1
"Kann apt-get gezwungen werden, den (ziemlich festen) Konflikt zu tolerieren und dann zu aktualisieren?" Entschuldigung, es ist nicht behoben. Sie müssen das Problem beheben, bevor Sie etwas anderes tun können. Und nein, widersprüchliche Pakete können nicht dazu gebracht werden, miteinander zu arbeiten. Und --forcingDinge sind im Allgemeinen eine schlechte Idee, wenn Sie nicht wissen, was Sie tun.
Faheem Mitha

@FaheemMitha, "es ist nicht behoben" bezieht sich auf was speziell? Das dpkg Level, das apt Level oder was?
Agc

PS: Ich wurde (von @derobert) darüber informiert, dass dies eine Manifestation des Debian-Fehlers 749355 ist . Das hättest du in der Frage erwähnen sollen. Sie sollten jedoch immer noch nicht versuchen, diese Pakete nebeneinander zu erstellen.
Faheem Mitha

Beide dpkgund aptsind eindeutig unzufrieden mit der aktuellen Situation. Und die einzige Möglichkeit, Probleme zu beheben, besteht darin, nicht beide Pakete installiert zu haben. Dies ist kein guter Weg, um sie zu beruhigen, und der Versuch, dies zu tun, führt nirgendwo hin.
Faheem Mitha

@FaheemMitha, "Bei dieser Frage geht es nicht um zwei bestimmte Pakete."
Agc

Antworten:


5

Da OP in den Kommentaren zu Gilles 'Antwort nach einer Liste von Befehlen gefragt hat (mit denen die relevanten Metadaten des Pakets geändert werden können), ist hier:

# download .deb
apt download parallel
# alternatively: aptitude download parallel

# unpack
dpkg-deb -R parallel_*.deb tmp/

# make changes to the package metadata
sed -i \
  -e '/^Version:/s/$/~nomoreutconfl/' \
  -e '/^Conflicts: moreutils/d' \
  tmp/DEBIAN/control

# pack anew
dpkg-deb -b tmp parallel_custom.deb

# install
dpkg -i parallel_custom.deb

Dies unter der Annahme, dass die Konfliktzeile nur moreutilseinen Eintrag enthält (und ohne Versionsbeschränkungen), wie dies bei meiner Installation der Fall war. Verwenden Sie andernfalls '/^Conflicts:/s/\(, \)\?moreutils\( [^,]\+\)\?//'als zweites sedSkript nur den relevanten Teil der Zeile und unterstützen Sie Versionsbeschränkungen.

Ihr installiertes Paket wird nicht durch neuere Versionen aus dem Repository überschrieben, und Sie müssen diesen Vorgang für jedes Update des parallelen GNU-Pakets manuell wiederholen, wenn Sie dieses Paket auf dem neuesten Stand halten möchten.


1
Nun, das funktioniert, apt upgradebeschwert sich aber über die Parallele (die gleiche Version wie die gerade optimierte .deb) been kept back. Dies ist jedoch eine Verbesserung der dpkg --force-conflictsMethode, bei der jedes Upgrade eines der Programme bricht - die phk- Methode ermöglicht jedes zweite Upgrade.
Agc

3

Ein Konflikt zwischen Paketen ist an und für sich schädlich. Wenn Sie dpkgdie Installation der in Konflikt stehenden Pakete erzwingen , kann dies keinen weiteren Schaden verursachen , wenn der Konflikt ohne triftigen Grund deklariert wurde, die Pakete jedoch weiterhin in Konflikt stehen. APT arbeitet hart daran, Konflikte bei der Installation von Paketen zu lösen, und es gibt keine Liste von Konflikten, die ignoriert werden müssen. Sie können dies nicht lösen, indem Sie verschiedene Optionen an Folgendes übergeben dpkg: Das Problem besteht darin, dass die Konflikte den eigenen Job von APT unmöglich machen.

Installieren Sie niemals widersprüchliche Pakete, es sei denn, es handelt sich um einen vorübergehenden Status, um aus einer Situation herauszukommen, in der APT ausfällt. Führen Sie APT erst aus, wenn Sie mit gearbeitet haben dpkg, um aus der Konfliktsituation herauszukommen.

Wenn Sie widersprüchliche Pakete installieren möchten, ändern Sie diese zuerst, um die Conflict:Deklaration zu entfernen , und lösen Sie zusätzlich zu den Problemen, die die Konfliktdeklaration motiviert haben.


Könnten Sie kurz erläutern, wie Sie "sie zuerst ändern, um die Conflict:Deklaration zu entfernen "?
Agc

1
@agc Erstellen Sie entweder das Paket neu oder ändern Sie das Binärpaket, indem Sie es in einem Editor wie Emacs öffnen und die controlDatei bearbeiten , oder ändern Sie das Binärpaket, indem Sie es entpacken, bearbeiten controlund neu packen.
Gilles 'SO - hör auf böse zu sein'

danke, aber bitte seien Sie genauer, verwenden Sie vorzugsweise sed(oder etwas Ähnliches) anstelle eines GUI- Editors. Das Ziel ist ein relativ narrensicherer Einzeiler, soweit dies möglich ist.
Agc
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.