Estou procurando uma implementação (no Linux) de um mecanismo que versão automática e transparente de qualquer alteração em um diretório (recursivamente). Isso pretende ser uma adição (possivelmente uma substituição, se todos os recursos solicitados estiverem disponíveis) ao versionamento padrão (SVN, git, ...)
Um produto no MS Windows que faz isso é o AutoVer (para ter uma idéia melhor dos requisitos). Eu adoraria ter algo assim, mas voltado para o Linux em um ambiente não gráfico.
Vi que existem algumas tentativas de ter essa funcionalidade no Linux, a mais próxima que encontrei é a versão automática no Subversion, mas não é óbvio para implementar em ambientes existentes (servidores onde, por exemplo, os arquivos de configuração são locais).
Talvez algo trabalhando com inotify
?
Agradecemos antecipadamente por qualquer indicação! WoJ
Respostas:
1. Método de uso geral usando bazar e inotify
Isso não foi testado por mim, mas eu encontrei essa gravação que utiliza o
bzr
(bazar) einotifywait
para monitorar um diretório e controlar a versão dos arquivos nele usando o bazar.Este script faz todo o trabalho de observar o diretório para alterações:
2. Gerenciando / etc
Para o caso especial de gerenciar o
/etc
diretório do seu sistema , você pode usar o aplicativo etckeeper .Aqui está um bom tutorial para você começar a usá-lo.
3. Usando git e incron
Esta técnica utiliza
git
eincron
. Para esse método, você precisa fazer o seguinte:A. Faça um repo
B. Crie um
$HOME/bin/git-autocommit
scriptC. Adicione uma entrada ao incrontab
4. Usando o Flashbake
Outra opção é usar uma ferramenta como o Flashbake . Flashbake é o sistema de controle de versão que Cory Doctorow (da fama do BoingBoing) usa para escrever seus livros.
O Flashbake usa o git sob o capô para rastrear as alterações, mas está entre fazer backups automatizados e usar um sistema de controle de versão simples.
Recursos
fonte
Imediatamente o ZFS vem à mente. Ele pode criar instantâneos - e existem alguns projetos para criar automaticamente instantâneos .
fonte
Eu acho que você está no caminho certo
inotify
. Este artigo detalha seu uso básico em um caso semelhante ao seu. Eu sugeriria usá-lo diretamente ou compilar um utilitário no nível do kernel como o fschange . Isso é um aborrecimento, mas você pode vincular a detecção de alterações a umgit commit
ou similar.Essas soluções têm o problema de depender de soluções de terceiros um tanto imperfeitas. Se você não se importa de sujar as mãos, o NodeJS oferece um excelente recurso de plataforma cruzada ( fs.watch ) para esse objetivo exato. Um tutorial básico sobre a observação de arquivos para alterações no NodeJS pode ser encontrado aqui . Em algumas dezenas de linhas ou menos, você pode escrever algo que monitore um diretório para arquivos e, em seguida, extrair (via child_process ) e executar um
git commit
ou semelhante (ou até incrementar manualmente um índice de arquivo de versão, se você gosta do roll-your- abordagem própria).fs.watch
é suportado peloinotify
linux, mas é muito mais intuitivo de usar. Existem outros projetos do NodeJS que agrupam essa funcionalidade de visualização de arquivos em vários níveis de conveniência, como este ou este .fonte
inotify
. Mas obrigada.O inotify (2) no Linux não poderá assistir a uma árvore grande, mas o sistema de arquivos fusível (montado em local separado) provavelmente poderia lidar com isso, traduzindo solicitações do sistema de arquivos para chamadas svn ou git ou alterando diretamente os metadados svn / git.
Essa é uma ideia muito interessante, mas eu não tinha ouvido falar de nenhuma implementação existente.
fonte
Esse script não é difícil de escrever.
Meu controle de versão favorito é o git.
O seguinte script deve fazer isso:
faça com que verifique periodicamente seu diretório - ou se o seu editor é chamado por script depois de salvar.
Mas se você fizer isso dessa maneira, pode fazer sentido excluir arquivos grandes e talvez alguns "inúteis" como salvamentos automáticos.
fonte
O SparkleShare ( http://sparkleshare.org ) é baseado no git e implementa uma funcionalidade semelhante ao Dropbox com controle de versão, mas você precisa configurar um servidor ssh (pode ser localhost).
fonte
Eu recomendo que você tente NILFS. Consulte a página sobre e você poderá decidir rapidamente se é esse o que procura ou não.
HTH
fonte
Também existe um modo de "pobre homem" fazer isso usando apenas rsync e um trabalho cron. Você basicamente depende do recurso de backup do rsync e usa dois caminhos separados, além de um prefixo / sufixo para acompanhar seus arquivos.
É mais ou menos assim: / usr / bin / rsync -a -A -X --backup --suffix =
date +".%Y-%m-%d_%H-%M-%S"
$ source_path $ backup_pathResultado final: alterar um arquivo chamado test_rsync no caminho de origem após a execução inicial resultará na criação de um arquivo chamado test_rsync.2017-02-09_11-00-01 no caminho de backup.
Há muitos problemas com isso (funciona se você tiver apenas uma quantidade razoável de arquivos e falhará nas alterações que ocorrem entre duas execuções consecutivas do rsync (1 minuto no meu caso)), mas pode ser suficiente para suas necessidades.
Se estamos falando aqui sobre compartilhamentos de samba, uma lista de exclusão pode estar em ordem, mas ainda não cheguei a isso.
Deixe-me saber se você melhorar isso.
fonte
Aqui está um script Python3 que executa o VMS como controle automático de versão de arquivo usando um carimbo de data / hora anexado ao nome do arquivo original quando salvo.
Eu coloquei um monte de comentários no script e executei meia dúzia desses scripts na minha máquina ubuntu, com apenas os diretórios diferentes em cada versão diferente do script, para que eu esteja simultaneamente versionando vários diretórios. Nenhuma penalidade real para o desempenho das máquinas.
! / usr / bin / env python3
print ("VERSIONING DE ARQUIVOS DE PROJETO INICIADOS") print ("version_creation.py") # coloque todo esse código no script com esse nome print ("execute como .. 'python3 version_creation.py' na linha de comando") print ("ctrl ' c 'para parar ") print (" ") print (" Para executar o programa em segundo plano, digite abaixo a linha de comando e feche a janela. ") print (" nohup python3 version_creation.py ") print (" .... to interrompa o processo, vá ao menu / administração / monitor do sistema ... e mate python3 ") print (" ") print (" Sempre salve os arquivos no diretório 'ProjectFiles' e os arquivos de versão ") print (" também serão criados nesse diretório . ") print (" ") print (" ") print (" ") print (" ")
importação shutil importação os tempo de importação
--- defina o intervalo de tempo para procurar novos arquivos (em segundos) abaixo
- este intervalo deve ser menor que o intervalo em que novos arquivos aparecem!
t = 10
--- defina o diretório de origem (dr1) e o diretório de destino (dr2)
dr1 = "/ caminho / para / diretório_de origem"
dr2 = "/ caminho / para / diretório_de destino"
importação glob importação os
dr1 = "/ home / michael / ProjectFiles" # os dois originais e versões serão salvos neste diretório
dr2 = "/ home / michael / ProjectFileVersions"
enquanto True:
print ("Vazio")
print ("1 Último_arquivo_do_arquivo =", Último_arquivo_do_arquivo)
print ("2 nome original =", nome original)
print ("filecreation =", filecreation)
print ("fivesec_ago =", fivesec_ago)
print ("timedif =", timedif)
compartilhar
o abaixo foi colocado anteriormente e funciona, mas eu gosto muito mais do script python acima ...... (usando python por cerca de 3 horas)
fonte