SVN: proprietà impostate sulle directory solo
-
16-09-2019 - |
Domanda
In SVN non v'è alcun modo per impostare (BugTraq) immobili in tutte le directory in un albero senza verificare tutto l'albero?
Non è possibile impostare proprietà nel repository direttamente senza impostare ganci. Anche se potessi io non sono sicuro che questo avrebbe aiutato -. Non è possibile impostare le proprietà ricorsive con Tortoise, e ho il sospetto che non sarebbe stato semplice con il client a riga di comando
Non ci sono casse sparse - ma se ho impostato la profondità vuoto per ogni directory, quindi proprietà di impostazione in modo ricorsivo non funziona anche se ho check manualmente ogni sottodirectory
.ho potuto controllare l'intero repository e utilizzare Tortoise per impostare le proprietà BugTraq sulle directory ricorsivamente (essi non vengono applicati ai file per impostazione predefinita). Ma che sta andando a richiedere me check-out l'intero archivio solo per questo.
C'è un modo migliore per farlo che mi manca?
Modifica:
Ho cercato di verificare l'intero repository e la modifica delle proprietà alla radice - ma il commit violato il nostro pre-commit hook: non è possibile modificare le proprietà sui tag. Senza rimuovere il gancio, sembra che sto andando ad avere bisogno di modificare manualmente le proprietà (su tutto, tranne i tag).
Soluzione
Ottenere un elenco di tutte le directory potrebbe essere un buon primo passo. Ecco un modo per farlo senza realmente controllare nulla:
-
Crea un file di testo con il contenuto del repository:
Elenco svn --depth infinito https://myrepository.com/svn/path / a / root / directory > everything.txt
-
Trim verso il basso per solo le directory. Directory finiranno tutti con una barra:
grep "/ $" everything.txt> just_directories.txt
Nel tuo caso ti consigliamo di aprirlo in un editor di testo ed estrarre le directory tag tuoi ganci soffocare.
Dal momento che hai il repository estratto è possibile utilizzare il file direttamente come input per un'operazione di propset:
svn propset myprop myvalue --targets just_directories.txt
Ho voluto impostare le proprietà direttamente sulle versioni repository dei file senza check-out prima, ma non ha funzionato. Ho anteposto ogni nome di directory con il percorso del repository ( https://myrepository.com/svn/ path / to / root / directory ) e ha cercato svn propset myprop mypropvalue --targets just_directories.txt , ma ha dato un errore: svn: Impostare proprietà su bersaglio non locale ' https://myrepository.com/svn/path/to/root/directory/ subdir1 ' ha bisogno di una revisione di base. Non so se c'è un modo per aggirare questo.
Altri suggerimenti
ho finito per scrivere uno script per farlo usando le associazioni pysvn (che sono molto facili da usare). E 'seguito nel caso in cui nessuno lo vuole.
import sys
import os
from optparse import OptionParser
import pysvn
import re
usage = """%prog [path] property-name property-value
Set property-name to property-value on all non-tag subdirectories in an svn working copy.
path is an optional argument and defaults to "."
"""
class Usage(Exception):
def __init__(self, msg):
self.msg = msg
def main():
try:
parser = OptionParser(usage)
(options, args) = parser.parse_args()
if len(args) < 2:
raise Usage("Must specify property-name and property-value")
elif len(args) == 2:
directory = "."
property_name = args[0]
property_value = args[1]
elif len(args) == 3:
directory = args[0]
property_name = args[1]
property_value = args[2]
elif len(args) > 3:
raise Usage("Too many arguments specified")
print "Setting property %s to %s for non-tag subdirectories of %s" % (property_name, property_value, directory)
client = pysvn.Client()
for path_info in client.info2(directory):
path = path_info[0]
if path_info[1]["kind"] != pysvn.node_kind.dir:
#print "Ignoring file directory: %s" % path
continue
remote_path = path_info[1]["URL"]
if not re.search('(?i)(\/tags$)|(\/tags\/)', remote_path):
print "%s" % path
client.propset(property_name, property_value, path, depth=pysvn.depth.empty)
else:
print "Ignoring tag directory: %s" % path
except Usage, err:
parser.error(err.msg)
return 2
if __name__ == "__main__":
sys.exit(main())