我想比较一下来自集市分支lp:ubuntu / nvidia-graphics-drivers的一些文件。我主要对该分支内的debian
子目录感兴趣,但由于http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/oneiric/nvidia-graphics-drivers/oneiric/files中的二进制blob,只需要很长时间才能获得文本文件。我已经下载了555MB,它仍在计算中。
是否可以通过以下属性之一检索集市分支,包括或排除某些文件:
debian/
)我不需要推回任何更改,也不需要查看文件的历史记录。我只想比较debian/
目录中的两个文件,扩展名为.in
的文件和不带文件的文件。
答案 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)