分支/签出时如何忽略某些文件?

时间:2011-07-29 08:54:37

标签: bazaar

我想比较一下来自集市分支lp:ubuntu / nvidia-graphics-drivers的一些文件。我主要对该分支内的debian子目录感兴趣,但由于http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/oneiric/nvidia-graphics-drivers/oneiric/files中的二进制blob,只需要很长时间才能获得文本文件。我已经下载了555MB,它仍在计算中。

是否可以通过以下属性之一检索集市分支,包括或排除某些文件:

  • 文件大小
  • 文件扩展名
  • 文件名(例如,仅包括debian/

我不需要推回任何更改,也不需要查看文件的历史记录。我只想比较debian/目录中的两个文件,扩展名为.in的文件和不带文件的文件。

3 个答案:

答案 0 :(得分:1)

据我所知,没有。您正在下载分支历史记录,而不仅仅是单个文件。每个文件都是分支历史中不可或缺的一部分。

从好的方面来说,你只需要检查一次。除非这些二进制文件发生变化,否则下次从Launchpad拉出时会跳过它们。

根据分支的历史记录,如果您使用轻量级结帐bzr checkout --lightweight),则可以减少下载大小。但是,当然,这可能会回来后再咬你,因为这意味着你不会得到分支的本地副本,只有签出的文件。因此它的工作方式与SVN类似,每个操作都必须通过服务器。只要您不需要查看分支历史记录或提交更改,我相信这应该可以为您提供服务。

答案 1 :(得分:0)

由于bzr info "$branch"bzr ls -d "$branch" "$directory"没有向我提供足够的信息,我最终对HTTP响应进行了一些肮脏的搜索。

以下Bash脚本依赖于Launchpads前端Loggerhead的工作。它从给定的URL递归下载。目前,它忽略了*.run个文件。将其bzrdl保存在$PATH的可用目录中,并使用bzrdl http://launchpad.net/~ubuntu-branches/ubuntu/oneiric/nvidia-graphics-drivers/oneiric/files/head:/debian/运行它。所有文件都将保存在当前目录中,请确保它为空以避免冲突。

#!/bin/bash
max_retries=5
rooturl="$1"
if ! [[ $rooturl =~ /$ ]]; then
    echo "Usage: ${0##*/} URL"
    echo "URL must end with a slash. Example URL:"
    echo "http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/oneiric/nvidia-graphics-drivers/oneiric/files/head:/"
    exit 1
fi
tmpdir="$(mktemp -d)"
target="$(pwd)"
# used for holding HTTP response before extracting data
tmp="$(mktemp)"
# url_filter reads download URLs from stdin (piped)
url_filter() {
    grep -v '\.run$'
}
get_files_from_dir() {
    local slash=/
    local dir="$1"
    # to avoid name collision: a/b/c/ -> a.d/b.d/c.d/
    local storedir="${dir//$slash/.d${slash}}"
    mkdir -p "$tmpdir/$storedir" "$target/$dir"
    local i subdir
    for ((i=0; i<$max_retries; i++ )); do
        if wget -O "$tmp" "$rooturl$dir"; then
            # store file list
            grep -F -B 1 '<img src="/static/images/ico_file_download.gif" alt="Download File" />' "$tmp" |\
                grep '^<a' | cut -d '"' -f 2 | url_filter \
                > "$tmpdir/$storedir/files"
            IFS=$'\n'
            for subdir in $(grep -F -B 1 '<img src="/static/images/ico_folder.gif" ' "$tmp" | \
                grep -F '<a ' | rev | cut -d / -f 2 | rev); do
                IFS=$' \t\n'
                get_files_from_dir "$dir$subdir/"
            done
            return
        fi
    done
    echo "Failed to download directory listing of: $dir" >> "$tmpdir/errors"
}
download_files() {
    local slash=/ 
    local dir="$1"
    # to avoid name collision: a/b/c/ -> a.d/b.d/c.d/
    local storedir="${dir//$slash/.d${slash}}"
    local done=false
    local subdir
    cd "$tmpdir/$storedir"
    for ((i=0; i<$max_retries; i++)); do  
        if wget -B "$rooturl$dir" -nc -i files -P "$target/$dir"; then
            done=true
            break
        fi
    done  
    $done || echo "Failed to download all files from $dir" >> "$tmpdir/errors"
    for subdir in *.d; do 
        download_files "$dir${subdir%%.d}/"
    done
}
get_files_from_dir ''
# make *.d expand to nothing if no directories are found
shopt -s nullglob
download_files ''
echo "TMP dir: $tmpdir"
echo "Errors : $(wc -l "$tmpdir/errors" 2>/dev/null | cut -d ' ' -f 2 || echo 0)"

之后不会删除临时目录和文件,必须手动完成。任何错误(下载失败)都将写入$tmpdir/errors

已确认可以使用:

bzrdl http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/oneiric/nvidia-settings/oneiric/files/head:/debian/

随意纠正任何错误或添加改进。

答案 2 :(得分:0)

目前没有办法从Bazaar分支机构有选择地检出特定目录,尽管我们计划在未来添加此类支持。

考虑到分支的大小,你正在做的克隆肯定有太多的流量。这可能是客户端实现中的一个错误。

这里的bzr 2.4它仍然很慢但不太糟糕(60s):

localhost:/tmp% bzr branch http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/oneiric/nvidia-settings/oneiric
Most recent Ubuntu Oneiric version: 275.09.07-0ubuntu1                                  
Packaging branch status: CURRENT
Branched 37 revision(s).  

来自日志:

[11866] 2011-07-31 00:56:57.007 INFO: Branched 37 revision(s).
56.786  Transferred: 5335kB (95.8kB/s r:5314kB w:21kB)