Configuração do servidor
Iniciar o CVS
Decida aonde o repositório principal vai permanecer e gerar uma cvs root. Por exemplo /usr/local/cvs (como root):
# mkdir -p /usr/local/cvs # setenv CVSROOT /usr/local/cvs # Define o CVSROOT para o novo local (local) # cvs init # Gera todos os arquivos internos de configuração do CVS # cd /root # cvs checkout CVSROOT # verifica os arquivos de configuração para modificá-los # cd CVSROOT edit config ( fine as it is) # cvs commit config cat >> writers # Gera um arquivo writers (também o readers opcionalmente) colin ^D # Utiliza [Control][D] para sair da edição # cvs add writers # Adiciona o arquivo writers dentro do repositório # cvs edit checkoutlist # cat >> checkoutlist writers ^D # Utiliza [Control][D] para sair da edição # cvs commit # Envia todas as alterações de configuração
Adiciona um arquivo readers se você quiser diferenciar permissões de leitura e escrita (read and write). Nota: Não edite (nunca) os arquivos diretamente no cvs principal, mas verifique o arquivo, modifique-o e verifique. Fizemos isso com o arquivo writers para definir o acesso a escrita.
há três modos populares de acessar o CVS nesse ponto. Os dois primeiros não necessitam de grandes configurações. Veja os exemplos em CVSROOT abaixo para como utilizá-los:
- Acesso local direto ao file system. O(s) usuário(s) precisa(m) permissão ao arquivo o suficiente para acessar o CS directamente e não há mais autenticação em adição ao login do OS. No entando isso só é útil se o repositório for local.
- Acesso remoto com o ssh e com o protocolo ext (ext protocol). Qualquer uso de uma conta com shell ssh e permissões de leitura e escrita (read/write) no servidor CVS podem acessar o CVS diretamente com o ext no ssh sem qualquer túneladicional. Não há processo no servidor sendo executado no CVS para ele que funcione. O login ssh faz a autenticação de login.
- Acesso remoto com o pserver (porta padrão: 2401/tcp). Esse é o uso preferido por grande base de usuário desde que os usuários são autenticados pelo CVS pserver com uma base de dados de senha dedicada, logo não há necessidade para contas de usuários local. Essa configuração é explicada abaixo.
Configuração de rede com o inetd
O CVS pode ser executado localmente somente se um acesso a rede não for necessário. Para um acesso remoto, a daemon inetd pode iniciar o pserver com o seguinte linha em /etc/inetd.conf (/etc/xinetd.d/cvs no SuSE):
cvspserver stream tcp nowait cvs /usr/bin/cvs cvs \ --allow-root=/usr/local/cvs pserver
Não é uma boa ideia bloquear a porta do port da Internet com o firewall e utilizar um túnel ssh para acessar o repositório remotamente.
Separar a autenticação
É possível ter usuários cvs que não são parte do OS (sem usuários local). Na verdade isso é provavelmente requerido também do ponto de vista da segurança. Simplesmente adicione um arquivo nomeado passwd (no diretório CVSROOT) contendo o login de usuário e senha no formato criptografado. Isso pode ser feito com a ferramenta htpasswd do apache (apache htpasswd tool).
Nota: Esse arquivo passwd é o único arquivo que deve ser editado diretamente no diretório CVSROOT. Também não será verificado. Mais informações com o htpasswd –help
# htpasswd -cb passwd user1 password1 # -c gera o arquivo file
# htpasswd -b passwd user2 password2
Agora adicione :cvs
no final de cada linha para dizer ao servidor cvs que altere o usuário para cvs (ou seja o que for que o ser servidor cvs estiver executando). Parece com isso:
# cat passwd user1:xsFjhU22u8Fuo:cvs user2:vnefJOsnnvToM:cvs
Testá-lo
Teste o login como usuário normal (por exemplo)
# cvs -d :pserver:colin@192.168.50.254:/usr/local/cvs login Logging in to :pserver:colin@192.168.50.254:2401/usr/local/cvs CVS password:
Variavel CVSROOT
Essa é uma variável de ambiente utilizada para especificar o local do repositório que estamos realizando as operações. Para uso local, Pode ser definido apenas para o diretório do repositório. Para uso na rede, o protocolo de transporte deve ser especificado. Defina a variável CVSROOT com o setenv CVSROOT string
em um shell csh, tcsh shell, ou com o export CVSROOT=string
em um shell sh, bash.
# setenv CVSROOT :pserver:<username>@<host>:/cvsdirectory Por exemplo: # setenv CVSROOT /usr/local/cvs # Utilizado localmente (somente) # setenv CVSROOT :local:/usr/local/cvs # O mesmo que acima # setenv CVSROOT :ext:user@cvsserver:/usr/local/cvs # Acesso direto com o SSH # setenv CVS_RSH ssh # para o acesso ext # setenv CVSROOT :pserver:user@cvsserver.254:/usr/local/cvs # rede com o pserver
Quando o login for bem sucedido, a pessoa pode importar um novo projeto para dentro do repositório:
cd dentro do diretório root do seu projeto
cvs import <module name> <vendor tag> <initial tag> cvs -d :pserver:colin@192.168.50.254:/usr/local/cvs import MyProject MyCompany START
Aonde MyProject é o nome do novo projeto no repositório (utilizado mais tarde para verificar). Cvs importará o conteúdo do diretório atual para dentro do novo projeto.
Verificar:
# cvs -d :pserver:colin@192.168.50.254:/usr/local/cvs checkout MyProject
ou
# setenv CVSROOT :pserver:colin@192.168.50.254:/usr/local/cvs
# cvs checkout MyProject
Tunelamento SSH para CVS
Precisamos de 2 shells para isso. No primeiro shell conectamos o servidor cvs com o ssh e direcionamos (port-forward) a conexão cvs. No segundo shell utilizamos o cvs normalmente como se estivesse sendo executado localmente.
no shell 1:
# ssh -L2401:localhost:2401 colin@cvs_server # Conecte diretamente ao servidor CVS. Ou: # ssh -L2401:cvs_server:2401 colin@gateway # Utilize um gateway para alcançar o CVS
no shell 2:
# setenv CVSROOT :pserver:colin@localhost:/usr/local/cvs # cvs login Logging in to :pserver:colin@localhost:2401/usr/local/cvs CVS password: # cvs checkout MyProject/src
Comandos CVS e uso
Import
O comando import é utilizado para adicionar um diretório inteiro, ele deve ser executado dentro do diretório para ser importado. Digamos que ao diretório /devel/ contem todos os arquivos e subdiretórios a serem importados. O nome do diretório no CVS (o módulo) será chamado “myapp”.
# cvs import [options] directory-name vendor-tag release-tag # cd /devel # Deve estar dentro do projeto para importá-lo # cvs import myapp Company R1_0 # libera tag, pode ser qualquer coisa em uma palavra
Depois de algum tempo um novo diretório “/devel/tools/” foi adicionado e precisa ser importado também.
# cd /devel/tools # cvs import myapp/tools Company R1_0
Verificar adição da atualização
# cvs co myapp/tools # Verificará somente as ferramentas do diretório # cvs co -r R1_1 myapp # Verifica myapp no release R1_1 (está colado) # cvs -q -d update -P # Uma atualização típica do CVS # cvs update -A # Redefine qualquer etiqueta colada (sticky tag) (ou data, opção) # cvs add newfile # Adiciona um novo arquivo # cvs add -kb newfile # Adiciona um novo arquivo binário # cvs commit file1 file2 # Envia somente os dois arquivos # cvs commit -m "message" # Envia todas as alterações feitas com uma mensagem
Gerar um patch
É melhor gerar e aplicar um a partir do diretório de desenvolvimento de trabalho relacionado ao projeto, ou de dentro do diretório fonte.
# cd /devel/project
# diff -Naur olddir newdir > patchfile # Gera um patch a partir de um diretório ou de um arquivo
# diff -Naur oldfile newfile > patchfile
Aplicar um patch
As vezes é necessário espanar um nível de diretório do patch, dependendo de como ele foi gerado. Em caso de dificuldades, simplesmente nas primeiras linhas do patch e tente -p0, -p1 ou -p2.
# cd /devel/project # patch --dry-run -p0 < patchfile # Teste o caminho (path) sem aplicá-lo # patch -p0 < patchfile # patch -p1 < patchfile # espana o primeiro nível do path