¿Cómo puedo detectar por progtwigción los files que faltan en el file tar y eliminarlos de svn repo

Tengo un script Perl para copyr algunos files de configuration de serveres remotos al repository SVN y ejecutar un commit. Los files de configuration en el server remoto son administrados por diferentes usuarios. A veces los usuarios eliminan los files. Quiero hacer que mi script sea lo suficientemente inteligente como para detectar que el file ha sido eliminado y poder emitir una subsiguiente eliminación e informe también en el server SVN.

¿Cómo puedo detectar files eliminados mediante progtwigción?

El process que estoy usando es

1) On remote server, the files are gzipping every midnight and placed at backup path. 2) on local server, script is using Net::SSH::Perl to copy the gzipped file and untar at svn repo path and execute a commit. 

Digamos que ayer alguien eliminó un file (por ejemplo, aa.txt) y que tampoco estará disponible en el file de copy de security de gzip. Quiero detectar mediante progtwigción ese file (aa.txt) antes o después de descomprimir en el server local y eliminar desde svn también antes de confirmar.

Espero estar claro ahora.

¿Está utilizando rsync para duplicar los files de configuration de la máquina remota a su copy de trabajo local?

Si es así, puede usar el indicador –delete para hacer que elimine los files locales cuando se han eliminado en el server remoto.

A continuación, puede usar el estado de svn para averiguar qué files se han agregado o eliminado, y luego emitir commands svn apropiados para agregarlos y eliminarlos, antes de confirmar los cambios.

¿Entonces en el server remoto, los files no están bajo el control svn, y los está arrastrando a su proyecto svn todas las noches?

Cuando se haya eliminado un file en su copy de trabajo, "estado svn" mostrará ese nombre de file con "!" Al frente. Vea este documento para el estado svn para más detalles.

 $ rm README.txt ... $ svn status ! README.txt 

Puede analizar el resultado de "svn status" en Perl para search los files que faltan y ejecutar el command "svn delete" para cada uno de ellos, seguido del único "svn commit".

¿Desea eliminar del server los files que se eliminan de su copy de trabajo?

Si es así, el paso de compromiso hará esto. El truco es copyr el directory que contiene los files, no solo los files individuales y confirmarlo. Todos los files eliminados de ese directory se eliminarán del repository.

¿Cómo puedo detectar files eliminados mediante progtwigción?

Si desea detectar files borrados solo ejecutando commands de shell en los hosts remotos a través de Net::SSH::Perl , entonces la respuesta depende del shell remoto. Aquí hay un ejemplo si el shell remoto es bash :

 my $ssh = Net::SSH::Perl->new("host1"); $ssh->login("user", "password"); $ssh->cmd("if [ ! -f /var/log/messages ]; then echo \"file missing!\""); 

Puede replace la ruta del file y el command echo por otra cosa.

Sé que esto probablemente no responda tu pregunta. Para get mejores respuestas, debe presionar el button 'editar' y agregar algunos ejemplos de los commands que ya está enviando al host remoto. No está claro cómo está "copyndo files" exactamente.

Puedo ver que mi pregunta ahora ha cambiado y tiene un significado diferente ahora. Me gustaría responder mi propia pregunta original. Espero que esto aclare las cosas.

 1) copy the tar archvie at some /tmp path as you are doing now. 2) make an array with the files in the archvie. I suggest below code. 3) Read the files from svn repo and create another array. Remember to remove the .svn directories. 4) Compare both array for the missing files in tar archvie and use svn delete command to delete missing files from svn repo. Dont forgot to commit after that. 

Esta es una parte de mi código.

 #! /usr/bin/perl use strict; use warnings; my @tararray = tarData("tar_archive"); my @configarray = configFiles(); foreach my $i (@configarray) { $i =~ s/^\.\///; my @diffs = "$i" if ! grep {$i eq $_} @tararray; foreach my $diff (@diffs) { system("svn -q delete $diff") || print $!; } system("svn commit -m 'message'"); } sub tarData { my $tarfile = shift; my @lists = Archive::Tar->list_archive($tarfile); return @lists; } sub configFiles { use Cwd; my $path = getcwd; my @config; find(\&d, "$path"); foreach my $file (@files) { chomp($file); next if $file =~ s/.svn//g; push @config, $file; } return @config; } sub d { -f and -r and push @files, $File::Find::name; } 

Use svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' )

Consulte http://geryit.com/blog/2011/03/command-line-subversion-practices/ para get más subversión de command-line

Guay.

¿Cuál es tu pregunta?

¿Tal vez estás buscando ganchos post-commit?