升级后重新启用PPA/源的最佳方法是什么?

当我从11.10升级到12.04时,重新启用我的PPA和添加的软件源的最佳方法是什么?
5个回答

你需要逐个取消注释位于/etc/apt/sources.list.d/目录中的文件中的行,以将它们全部添加回来/重新启用。
尽管升级时机是重新评估是否需要PPA的好时机,特别是如果你只是为了获取一个软件包的更新版本而使用它。

我写了一个bash脚本,用于删除在升级过程中被禁用的sources.list.d目录下所有文件的前导哈希字符。
以下代码用于将raring源升级到saucy
如果你想保留后缀# disabled on upgrade to ...,请使用。
for f in /etc/apt/sources.list.d/*.list; do sudo sed -i 's/raring/saucy/g' $f; sudo sed -i 's/^# \(.*disabled on upgrade to.*\)/\1/g' $f;done

如果您想删除后缀#禁用升级到...,请使用

for f in /etc/apt/sources.list.d/*.list; do sudo sed -i 's/raring/saucy/g' $f; sudo sed -i 's/^# \(.*\) # disabled on upgrade to.*/\1/g' $f;done

这是一个使用Python APT API来查找和启用这些源的Python脚本,同时将版本设置为当前版本。
#! /usr/bin/python3

import aptsources.sourceslist as sl
import lsb_release

codename = lsb_release.get_distro_information()['CODENAME']
sources = sl.SourcesList()

for source in sources.list:
    if source.comment.lower().find("disabled on upgrade") >= 0:
        source.dist = codename
        source.set_enabled(True)
        print(source)
sources.save()

如果你不用sudo运行它,就无法保存更改,但会显示哪些源将被启用。使用sudo来保存更改。

这是否会将“#deb http://cran.rstudio.com/bin/linux/ubuntu artful/”替换为“#deb http://cran.rstudio.com/bin/linux/ubuntu bionic”?如果不这样做会发生什么(如您前面的回答所述)? - Jeffrey Benjamin Brown
@JeffreyBenjaminBrown 如果你不替换它,可能会导致依赖关系无法满足。 - muru
我发现在一些被注释为“升级时禁用”的行中,单词“artful”(17.10代号)已被替换为“bionic”,而其他行则没有。我只是取消了所有带有“disabled”注释的行,然后apt继续工作了(尽管我不知道为什么还要重新安装gcc)。而且我使用了很多第三方软件源——sources.list.d目录下有13个文件,sources.list中还有三个外部软件源。也许这是Ubuntu现在自动处理的事情吗? - Jeffrey Benjamin Brown
@JeffreyBenjaminBrown 可能吧,我最近没有升级过(通常都是重新安装),所以不太清楚。 - muru
1这似乎破坏了我在19.10版本中的apt源文件。 - Dreamcat4
@Dreamcat4,如果我不知道你的 sources.list 是什么样子的,我就无法做太多事情。 - muru

我创建了一些脚本,用于启用(重新启用)和禁用PPA,特别是在升级后。以下是它们: PPA重新启用脚本
#! /bin/bash
# PPA re-enable script
# Use: ppa-reenable source.list
# to reenable a PPA without its source line
# Use: ppa-reenable src source.list
# to reenable a PPA with its source line

mod=1
file="$1"
if [ $1 == "src" ]; then mod=""; file="$2"; fi;
sudo sed -i "${mod}s/^# \(.*\) \(disabled on upgrade.*\)\?/\1/" "$file"

PPA禁用脚本
#! /bin/bash
# PPA disable script
# Use: ppa-disable source.list
# to disable the PPA completely
# Use: ppa-disable src source.list
# to disable the source of the PPA only

file="${1}"
mod=""
# If its only needed to disable the source
if [ $1 = "src" ]; then mod="2"; file="${2}"; fi;

# If source line is disabled, don't comment it out
second="`sed -n 2p \"$file\"`"
second="${second:0:1}"
if ( [ $second == "#" ] && [ $mod != "2" ] ); then
    mod="1"
fi

sudo sed -i "${mod}s/^/# /" "$file"

为了将此脚本存储在您的主目录 bin 目录中,包括了 sudo


为了检查和自动更新源列表文件,我使用curl和codename创建了以下脚本。

#!/bin/bash

CODENAME="$(lsb_release -cs)"

for file in /etc/apt/sources.list.d/*.list; 
   do
      APT_URL="$(cat $file | grep -Eo '(http|https)://[a-zA-Z0-9./?=_-]*' | sort | uniq)"
      CURRENT_CODES="$(cat $file | rev | awk '{NF=2}1' | rev | awk '{print $1;}')"
      LENGTH=${#APT_URL}
      [[ ${APT_URL:LENGTH-1:1} != */ ]] && APT_URL="$APT_URL/"; :
      NEW_APT_URL="${APT_URL}dists/${CODENAME}"
      echo -n "$NEW_APT_URL"
      STATUS=$(curl --head --location --write-out %{http_code} --silent --output /dev/null ${NEW_APT_URL})
      if [[ $STATUS == 200 ]]; then
         echo -en "\e[93m OK\033[0m"
         for code in $CURRENT_CODES;
            do
               [[ $code != $CODENAME ]] && sudo sed -i "s/$code/$CODENAME/g" $file
         done;
         sudo sed -i 's/^# \(.*\) # disabled on upgrade to.*/\1/g' $file
         echo -e "\e[92m DONE\033[0m"
      else
         echo -e "\e[91m NOT FOUND\033[0m"
      fi
done;