Pergunta

Já brinquei um pouco com o CVS e não estou muito familiarizado com todos os seus recursos, mas um grande aborrecimento para mim é tentar adicionar novos diretórios que contenham mais diretórios.Correndo "cvs add"adiciona apenas o conteúdo do diretório atual e usando"cvs import" também não parecia a coisa certa, já que ainda é todo o código que estou produzindo (este tutorial de importação reivindicada é para Fontes de terceiros)

Vocês conhecem alguma maneira de adicionar recursivamente tudo em um determinado diretório ao projeto CVS atual (ou se o SVN ou o git tornam isso notavelmente mais fácil)?

Foi útil?

Solução

Ah, espaços.Isso funcionará com espaços:

find . -type f -print0| xargs -0 cvs add

Outras dicas

Achei que isso funcionou de maneira bastante eficaz:

Primeiro, adicione todos os diretórios, mas não nenhum chamado "CVS":

find . -type d \! -name CVS -exec cvs add '{}' \;

Em seguida, adicione todos os arquivos, excluindo qualquer coisa em um diretório CVS:

find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs add '{}' \; \)

Agora, se alguém tem uma cura para o constrangimento de usar CVS nos dias de hoje...

Eu uso isso:

Primeiro adicione recursivamente todos os diretórios menos os do CVS:

$> find . -type d \! -name CVS -exec cvs add '{}' \;

Em segundo lugar, adicione todos os arquivos, menos os diretórios CVS:

 find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs add '{}' \; \)

Terceiro, faça “commit” recursivamente como o comentário da “primeira versão”:

 find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs commit -m "first version" '{}' \; \)

Última marcação recursivamente:

 find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs tag -F MY_CVS_TAG '{}' \; \)

Primeiro adicione todos os diretórios ao CVS

find . -type d -print0| xargs -0 cvs add

Em seguida, adicione todos os arquivos nos diretórios ao CVS

find . -type f | grep -v CVS | xargs cvs add

Funcionou para mim

cvs import não é apenas para fontes de terceiros.Na verdade, os diretórios não são versionados pelo CVS, portanto não estão sujeitos às políticas da filial.Contanto que você importe diretórios vazios, tudo bem.

Observe que você só pode usar cvs add em arquivos e pastas que estão localizados dentro de uma cópia de trabalho já retirada, caso contrário você obterá o "Não é possível abrir CVS/entradas para leitura" mensagem.Uma técnica para criar um novo “módulo raiz” usando cvs add é explicado neste item de FAQ do WinCVS: http://cvsgui.sourceforge.net/newfaq.htm#add_rootmodule

Se você estiver no Windows, tanto o TortoiseCVS quanto o WinCVS suportam adição recursiva (e commit opcional) de vários arquivos em uma única operação.No WinCvs procure a macro Add>Recursive Add (auto-commit)...No Tortoise use o comando Adicionar Conteúdo em um diretório.Ambos permitirão que você selecione quais arquivos adicionar e quais modos de expansão de palavras-chave usar para eles (usados ​​principalmente para definir quais arquivos são binários).

Para mais informações sobre adição recursiva no WinCvs, veja aqui: http://cvsgui.sourceforge.net/newfaq.htm#cvs-add_recursive


Além disso cvs import é adequado para adições em massa.Porém, o caminho cvs import é implementado no Vanilla CVS tem duas desvantagens (porque era originalmente escrito para código de terceiros):

  • cria um branch obrigatório com semântica especial.
  • ele não cria os metadados do repositório (ou seja,os diretórios ocultos do CVS) necessário para estabelecer o código importado como uma cópia de trabalho com check-out, o que significa que para realmente trabalhar com os arquivos importados você primeiro terá que retirá-los do repositório

Se você estiver usando CVSNT, poderá evitar ambas as desvantagens especificando o -nC opção na importação. -n é para evitar o ramo "fornecedor" e -C é para criar os diretórios CVS.

Esta resposta de Mark foi útil (encontre .-Type f -Print0 | XARGS -0 CVS Adicionar), mas resolvi algum problema que ocorreu quando os CVs adicionam tentar adicionar seus próprios arquivos como tag, entradas, etc.

  1. Adicione sua pasta de nível mais alto chamada NEW_FOLDER
cvs add NEW_FOLDER
  1. Use o comando anterior com alguma exclusão para adicionar a árvore de todas as subpastas

encontre NEW_FOLDER/ -digite d!-nome "CVS" -e !-nome "Tag" -e !-name "Entries.Log" -e !-name "Entradas" -e !-name "Repositório" -e !-Nome "root" -print0 | XARGS -0 CVS Adicionar

  1. Use o comando anterior com alguma exclusão para adicionar todos os arquivos

encontre NEW_FOLDER/ -digite f !-nome "CVS" -e !-nome "Tag" -e !-name "Entries.Log" -e !-name "Entradas" -e !-name "Repositório" -e !-Nome "root" -print0 | XARGS -0 CVS Adicionar

Acho que foi isso que fiz na minha época de CVS:

find . -type f | xargs cvs add

Primeiro adicione todos os diretórios ao CVS

find . -type d -print0| xargs -0 cvs add

Em seguida, adicione todos os arquivos nos diretórios ao CVS

find . -type f -print0| xargs -0 cvs add

Estou usando este script de shell simples, que deve ser iniciado a partir de um diretório CVS já verificado.Ele estupidamente tentará adicionar/comprometer quaisquer arquivos e diretórios que encontrar em sua pesquisa recursiva, então no final você deverá acabar com uma árvore de commit completa.

Simplesmente salve isso como algo como /usr/bin/cvsadd e não se esqueça de chmod +x /usr/bin/cvsadd.

#!/bin/sh
# @(#) add files and directories recursively to the current CVS directory
# (c) 2009 by Dirk Jagdmann 

if [ -z "$1" ] ; then
    echo "usage: cvsadd 'import message'"
    exit 1
fi

if [ -d "$2" ] ; then
    cvs add "$2"
    cd "$2" || exit 1
fi

if [ ! -d CVS ] ; then
    echo "current directory needs to contain a CVS/ directory"
    exit 1
fi

XARGS="xargs -0 -r -t -L 1"

# first add all files in current directory
find . -maxdepth 1 -type f -print0 | $XARGS cvs add
find . -maxdepth 1 -type f -print0 | $XARGS cvs ci -m "$1"

# then add all directories
find . -maxdepth 1 -type d -not -name CVS -a -not -name . -print0 | $XARGS "$0" "$1"

Os métodos já discutidos farão pesquisa recursiva, mas falhará se você executar a mesma ação novamente (se você quiser adicionar subárvore à árvore existente) por esse motivo, você precisa verificar se seus diretórios ainda não foram adicionados e adicionar apenas arquivos que não adicionado ainda.Para fazer isso usamos a saída de cvs up para ver quais elementos ainda não foram adicionados - haverá um ponto de interrogação no início da linha.

Nós usamos opções -0, -print0 e -zZ para ter certeza de que processamos corretamente os espaços nos nomes dos arquivos.Nós também usamos --no-run-if-empty para evitar a execução se nada precisar ser adicionado.

CVS_PATTERN=/tmp/cvs_pattern
cvs -z3 -q up | egrep '^\?.*' | sed -e 's/^? //' > $CVS_PATTERN
find . -type d \! -name CVS -print0 | grep -zZf $CVS_PATTERN | xargs -0 --no-run-if-empty cvs add
find . \( -type d  -name CVS -prune \) -o \( -type f  -print0 \) | grep -zZf $CVS_PATTERN | xargs -0 --no-run-if-empty cvs add
cvs commit -m 'commiting tree recursively'

Com esta abordagem evitaremos tais erros:

cvs add: cannot add special file `.'; skipping
cvs [add aborted]: there is a version in ./dirname1 already

e

cvs add: `./dirname2/filename' already exists, with version number 1.1.1.1

eu gosto de fazer (já que o diretório precisa ser adicionado)

cvs status 2>/dev/null | awk '{if ($1=="?")system("cvs add "$2)}'

pode ser necessário executar isso várias vezes (primeiro para o diretório e depois para seus filhos) até que não haja saída

A solução de Marcos resolve o problema de espaços, mas produz este problema:

cvs adicionar:Não é possível abrir CVS/entradas para leitura:Não existe tal arquivo ou diretório
CVS [Adicionar abortado]:sem repositório

Para consertar, o comando real a ser usado é:

find . -type f -exec cvs add {} \;

O SVN definitivamente torna essa tarefa trivial, mas usar uma GUI como o Tortoise é ainda mais fácil.

Este pode ser um bom lugar para começar: http://www-mrsrl.stanford.edu/~brian/cvstutorial/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top