130

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
  • 75,875
  • 31
  • 191
  • 309
Treviño
  • 2,554
  • 2
  • 18
  • 21
  • 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

101

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,221
  • 1
  • 14
  • 11
funicorn
  • 3,726
  • 2
  • 19
  • 16
53

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
  • 3
  • 11
enzotib
  • 92,255
  • 11
  • 164
  • 178
  • 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
  • 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
  • 75,875
  • 31
  • 191
  • 309
Alin Andrei
  • 7,348
  • 4
  • 42
  • 55
  • 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
  • 9,995
  • 2
  • 78
  • 90
4

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,462
  • 27
  • 17
-2

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).

Martin Zeitler
  • 403
  • 2
  • 9