133

When I add a PPA and I want to install some of its content, it is quite annoying to re-update all my apt list using apt-get update.

Is it instead possible to only sync the content of a given repository?

Anwar
  • 76,649
Treviño
  • 2,584
  • 1
    Starting from wily, you could just use add-apt-repository -u – Treviño Jul 17 '15 at 22:34
  • There is no -u on Ubuntu (15.x) Vivid as far as I can tell. – kenorb Nov 14 '15 at 19:53
  • @Treviño It isn't mentioned in the Wily manpage: http://manpages.ubuntu.com/manpages/wily/en/man1/add-apt-repository.1.html Is it documented elsewhere? – muru Feb 11 '16 at 20:26
  • @muru I think that has to be fixed, it's only mentioned on add-apt-repository --help. Please open a bug asking to fix the manpage. – Treviño Feb 19 '16 at 00:26
  • @Treviño @muru FYI, the -u functionality was removed since 18.04. See https://askubuntu.com/questions/65245/apt-get-update-only-for-a-specific-repository/1132852#1132852 – wisbucky Apr 10 '19 at 22:44

6 Answers6

104

yes, apt-get can do that, and can do it in a nice way.

  1. Append following to ~/.bash_funcs

    update-repo() {
        for source in "$@"; do
            sudo apt-get update -o Dir::Etc::sourcelist="sources.list.d/${source}" \
            -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"    
        done
    }
    
  2. Append following to ~/.bashrc

    if [ -f $HOME/.bash_funcs ]; then
    .  $HOME/.bash_funcs
    fi
    
  3. Append following to ~/.bash_completion

    # Debian user-defined completion                             -*- shell-script -*-
    
    _ppa_lists(){
        local cur
        _init_completion || return
    
        COMPREPLY=( $( find /etc/apt/sources.list.d/ -name "*$cur*.list" \
    -exec basename {} \; 2> /dev/null ) )
        return 0
    } &&
    complete -F _ppa_lists update-repo
    
  4. Then source the files

    . ~/.bashrc
    . ~/.bash_completion
    
  5. Done and start to fire it

    update-repo <tab> <tab>
    

You can update a single ppa repository without having to update whole apt source, with implement of bash-completion.

thebugfinder
  • 2,261
funicorn
  • 3,866
55

If the repository is configured in a specific file in the directory /etc/apt/sources.list.d/, say myrepo.list, you can update that single repository with the command:

sudo apt-get update -o Dir::Etc::sourcelist="sources.list.d/myrepo.list" \
    -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"

Nevertheless this is not very convenient.
This can be simplified defining a bash function

update_repo() {
    sudo apt-get update -o Dir::Etc::sourcelist="sources.list.d/$1.list" \
        -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
}

so that you can simply run

update_repo myrepo
crass
  • 465
enzotib
  • 93,831
  • I've checked this again, but it doesn't work if then you want to install a package that has some unresolved dependency on another repository (also in the main archive) – Treviño Nov 13 '11 at 19:25
  • 1
    can you explain what does '-' mean in sourceparts config? – Sajuuk Apr 03 '19 at 02:14
  • 1
    I think '-' just a dummy way to tell sourceparts should not be used. See https://github.com/Debian/apt/blob/master/apt-pkg/sourcelist.cc#L313 . I could be wrong though, couldn't find a proper doc explaining the '-'. – randomness2077 Apr 09 '19 at 18:00
12

Y PPA Manager comes with a command line tool called update-ppa that lets you update a single PPA.

For example:

sudo update-ppa ppa:nilarimogard/webupd8

Also, when adding a PPA through Y PPA Manager, the PPA source is automatically updated (only for that PPA). In a future version, there's going to be a GUI to manually update single PPAs as well.

More information about Y PPA Manager, HERE.

Anwar
  • 76,649
Alin Andrei
  • 7,348
  • 6
    sudo add-apt-repository ppa:webupd8team/y-ppa-manager then sudo apt-get update and finally sudo apt-get install y-ppa-manager – mchid Nov 08 '14 at 05:16
9

To update a specific repository, use -o, e.g.:

apt-get update -o Dir::Etc::sourcelist=/path/to/repo.list

Here is a one-liner updating only recently added apt repository

find /etc/apt/sources.list.d -type f -name '*.list' -exec sudo apt-get update -o Dir::Etc::sourcelist="{}" ';'

It's much quicker than updating all repositories, especially during VM provisioning after adding new.

kenorb
  • 10,347
5

The -u option was added in 15.10. From 15.10 to 17.10, you could use -u to automatically update only the specific repo you are adding:

add-apt-repository -u my-ppa

The silly thing is that this option was not added to man until 18.04 (it was documented in add-apt-repository --help, however). But in 18.04, this functionality was removed! (Again, not in man, but you can see in add-apt-repository --help).

In 18.04, the update functionality was changed to always do a full apt-get update after add-apt-repository. The -u option was effectively removed. It remains there for legacy syntax, but it is always set to options.update = False. In 18.04, you do have the option of -n, --no-update, which is like the old behavior. But it's all or nothing, you cannot update a single repo since 18.04.

wisbucky
  • 2,552
  • 28
  • 17
-3

One can also reduce the available choices to one single repository:

echo "deb http://archive.ubuntu.com/ubuntu/ focal universe" > /etc/apt/sources.list
apt-get update -y && apt-get install -y ncftp

This may be radical, but it saves time and traffic, when running apt-get in a single-use container.
If you don't know what a single-use container is, please educate yourself before casting a vote...
because this is a correct and functional answer, which serves an actual purpose (saving time).