2013-11-27 58 views
0

有一個在線回購有13k提交,但我只對其中的最後1000個感興趣。是否有可能使用svnsync複製它們?我可以使用svnsync創建淺倉庫副本嗎?

我希望能夠從這個本地資源庫最後提交1000內結賬,並且它應該不是從服務器

版本號必須保留更快。
svnsync必須能夠將未來修訂通常同步到本地存儲庫中。

+0

將它們複製到哪裏?複製到另一個存儲庫?獲取轉儲流? – bahrep

回答

1

在以下示例中,我保存了回購的最後45個提交。助手python腳本如下。

# svnsync 1.6.11 
# rhel 6 x86_64 

# params 
svn_baserepourl="http://svn.igniterealtime.org/svn/repos" 
svn_subdir="spark/trunk" 
reponame=spark 
skipuntil=13774 


# well-known svnsync preparation 
repopath=`pwd`/$reponame.svn 
svnadmin create "$repopath" 

echo '#!/bin/sh' >"$repopath"/hooks/pre-revprop-change 
chmod +x "$repopath"/hooks/pre-revprop-change 

svnsync init file://"$repopath" "$svn_baserepourl/$svn_subdir" 

expectedfmt="4 
layout sharded 1000" 

if [ x"$expectedfmt" != x"$(cat "$repopath/db/format")" ]; then 
    echo unknown db format 
fi 

# create database folder structure 
(cd "$repopath/db" && echo $(for ((i=0; i<=$((skipuntil/1000)) ; i++)) ; do mkdir -p revprops/$i revs/$i; done)) 

# don't create last skipped revision 
skipuntil=$((skipuntil - 1)) 

# create dummy revision files 
(cd "$repopath/db" && for ((i=0; i<=$skipuntil; i++)) ; do echo revprops/$((i/1000))/$i; echo revs/$((i/1000))/$i; done | xargs touch) 

# update revision counter 
echo $skipuntil >"$repopath/db/current" 

# we need a valid revision file 
cp "$repopath/db/revs/0/0" "$repopath/db/revs/$((skipuntil/1000))/$skipuntil" 

# last skipped revision number 
skipuntil=$((skipuntil + 1)) 

if false; then 
    # TODO: if svnrdump available 
    # mkdir in local repo 
    # svnrdump last skipped revision and subdir 
    # svnadmin load --parent-dir subdir 
    : 
else 
    # checkout last skipped revision 
    rm -rf temptree 
    svn co -r $skipuntil "$svn_baserepourl/$svn_subdir" "temptree/$svn_subdir" 
    cd temptree 
    pushd "$svn_subdir" 

    # save properties 
    svn proplist --xml -v -R | ~/svnprops.py >/tmp/propset.sh 

    # remove .svn folders 
    find . -name .svn -print0 | xargs -0 rm -rf 

    popd 

    # checkout our copy 
    svn co "file://$repopath" . 

    # add the files 
    svn add --no-ignore --force . 

    # delete automatic props 
    for p in $(svn proplist -q -R | sort -u); do svn propdel -q -R $p; done 

    # restore original props 
    pushd "$svn_subdir" 
    sh /tmp/propset.sh 
    popd 

    # commit the last skipped revision 
    svn commit -m"shallow root" 

    cd .. 
    rm -rf temptree 
fi 

# update svnsync counters 
svn propset --revprop -r 0 svn:sync-last-merged-rev $skipuntil "file://$repopath" 
svn propset --revprop -r 0 svn:sync-currently-copying $((skipuntil+1)) "file://$repopath" 

# sync! 
svnsync sync "file://$repopath" 

這是一些老svnprops.py回購之間的svn屬性複製:

#!/usr/bin/env python 

import sys 
import xml.sax 
import xml.sax.handler 

""" 
<?xml version="1.0"?> 
<properties> 
<target 
    path="file:///.snapshots/persist/builds/cyg-apt/cyg-apt.svn/trunk"> 
<property 
    name="svn:ignore">build 
</property> 
</target> 
</properties> 
""" 

class Subhandler: 
    def __init__(self, mainHandler, parenthandler): 
    self.mainHandler = mainHandler 
    self.parenthandler = parenthandler 
    self.subhandler = None 
    self.lvl = 0 
    def startElement(self, name, attributes): 
    self.lvl = self.lvl + 1 
    def characters(self, data): 
    pass 
    def endElement(self, name): 
    self.lvl = self.lvl - 1 

class Subhandler_properties(Subhandler): 
    def startElement(self, name, attributes): 
    pass 
    def characters(self, data): 
    pass 
    def endElement(self, name): 
    pass 

class P1ropertiesDocHandler(xml.sax.handler.ContentHandler): 
    def __init__(self): 
    self.subhandler = None 

    def startElement(self, name, attributes): 
    if subhandler != None: 
     subhandler.startElement(name, attributes) 
    elif name == "properties": 
     Subhandler_properties(self) 

    def endElement(self, name): 
    if subhandler != None: 
     subhandler.endElement(name) 

    def characters(self, data): 
    if subhandler != None: 
     subhandler.characters(data) 


class PropertiesDocHandler(xml.sax.handler.ContentHandler): 
    def __init__(self): 
    self.target = None 
    self.property = None 

    def startElement(self, name, attributes): 
    if name == "target": 
     self.target = attributes["path"] 
    elif name == "property": 
     self.property = attributes["name"] 
     self.propval = "" 

    def endElement(self, name): 
    if name == "target": 
     self.target = None 
    elif name == "property": 
     print("svn ps \"" + self.property.replace("\"","\\\"") + "\" \"" + self.propval.replace("\"","\\\"") + "\" \"" + self.target.replace("\"","\\\"") + "\"") 
     self.property = None 
     self.propval = None 

    def characters(self, data): 
    if self.property != None: 
     self.propval += data 

parser = xml.sax.make_parser() 
handler = PropertiesDocHandler() 
parser.setContentHandler(handler) 
#print("aa\"ass".replace("\"","\\\"")) 
parser.parse(sys.stdin) 
1

將這些最新的1000個修訂版複製到哪裏? svnsync工具用於存儲庫複製,而不是「複製」修訂版。如果您想遠程獲取最近的1000個修訂版本,請使用​​,您可以在其中指定版本範圍。

+0

我想在最近的1000次提交中進行快速結賬 – basin

+1

然後用它們做什麼?您將無法從這些工作副本中提交回原始存儲庫。 – alroc

+0

'svnrdump'可以完成部分工作。更新了我的答案。未解決的問題是如何快速增加本地回購的修訂版本號。 – basin

相關問題