Faça o checkout de um arquivo do Subversion


320

"Não é possível verificar um único arquivo. O melhor nível de checkout que você pode fazer é no nível do diretório".

Como contornar esse problema ao usar o Subversion?

Temos esta pasta no Subversion, onde guardamos todas as nossas imagens. Eu só quero verificar um arquivo (imagem) a partir disso. Essa pasta é muito grande e tem várias outras coisas que não preciso agora.


Você pode fazer o contrário. Efetue login no servidor de produção e svn upno diretório local do seu computador.
Neocortex

Respostas:


403

A resposta simples é que você svn exportarquiva o arquivo em vez de fazer o check-out.

Mas isso pode não ser o que você deseja. Convém trabalhar no arquivo e fazer o check-in novamente, sem precisar fazer o download de GB de lixo eletrônico desnecessário.

Se você possui o Subversion 1.5+, faça uma verificação esparsa:

svn checkout <url_of_big_dir> <target> --depth empty
cd <target>
svn up <file_you_want>

Para uma versão mais antiga do SVN, você pode se beneficiar do seguinte:

  • Faça o checkout do diretório usando uma revisão no passado distante, quando estava menos cheio de lixo que você não precisa.
  • Atualize o arquivo desejado para criar uma revisão mista. Isso funciona mesmo que o arquivo não exista na revisão que você efetuou o check-out.
  • Lucro!

Uma alternativa (por exemplo, se o diretório tiver muito lixo desde a revisão em que foi criado) é fazer uma cópia de URL-> URL do arquivo que você deseja em um novo local no repositório (efetivamente, este é um ramo ativo do arquivo). Confira esse diretório e faça suas modificações.

Não tenho certeza se você pode mesclar sua cópia modificada de volta inteiramente no repositório sem uma cópia de trabalho do destino - nunca precisei. Se sim, faça isso.

Caso contrário, infelizmente, talvez seja necessário encontrar outra pessoa que tenha o diretório inteiro verificado e levá-lo a fazê-lo. Ou, talvez, quando você fizer as modificações, o restante tenha terminado o download ...


13
A solução realmente simples é acessar o repositório com um navegador da web.
Dolmen

11
@dolmen - Supondo que não seja necessário modificar o arquivo, talvez (e assumindo que uma interface da Web esteja sendo executada para esse repositório). Eu uso o SVN da linha de comando; portanto, para mim, é mais simples de usar svn exportdo que usar a interface da Web, se eu souber qual arquivo eu quero. O questionador já usa SVN, então acho que depende de qual cliente e se esse cliente facilita o uso svn export. Eu encontrar a interface web melhor para navegar do que svn ls, embora :-)
Steve Jessop

2
O SmartSVN Client bloqueará arquivos individuais se o seu Subversion Server suportar. E existem ganchos que exigem check-out antes que um arquivo binário / executável possa ser verificado. Realmente não faz sentido que duas pessoas modifiquem uma multa binária e que essas alterações sejam mescladas. Esses podem ser novos recursos que não estavam disponíveis quando essa pergunta foi feita.
TamusJRoyce

@Tamus: "Realmente não faz sentido" concordou, mas nos casos que descrevo a fusão é apenas para obter a nova versão de volta ao local original. Não é esperado que o arquivo binário tenha sido modificado no destino da mesclagem. Portanto, o arquivo em si não precisa de nenhuma "fusão" além de substituir a versão antiga pela nova, é exatamente o que o SVN chama e registra de onde vieram as alterações para referência futura. Você está certo, a prevenção de conflitos pode ser imposta bloqueando o arquivo durante o período.
Steve Jessop

1
O TortoiseSVN pode verificar arquivos individuais. Eu acredito que faz a mesma coisa nos bastidores para conseguir isso.
Mike Starov

109

Tente em svn exportvez de svn checkout. Isso funciona para arquivos únicos.

O motivo da limitação é que checkoutcria uma cópia de trabalho, que contém metainformações sobre repositório, revisão, atributos etc. Esses metadados são armazenados em subdiretórios denominados '.svn'. E arquivos únicos não têm subdiretórios.


2
Advertência: As versões extremamente antigas do svnnão fazem exportação de arquivo único.
Mladen Jablanović

5
Esse é o método superior se você quiser apenas obter a versão mais recente de um script específico como parte de uma implantação, ou algo assim.
William.berg

2
Essa ressalva foi um exagero mesmo em 2011, mas versões extremamente antigas podem fazer svn cat $url_to_file_in_repo > $local_file_name.
cprn 12/06/19

53

Use svn catou svn export.

Para isso, você não precisa buscar o diretório de trabalho, mas não poderá confirmar nenhuma alteração feita. Se você precisar fazer alterações e confirmá-las, precisará de um diretório de trabalho, mas não precisará buscá-lo completamente. Faça o checkout da revisão em que o diretório ainda estava / quase vazio e use 'svn cat' para extrair o arquivo do HEAD.


svn cat svn://.../my_file.txtera exatamente o que eu estava procurando. Eu trabalho em um svn://único http://repositório (não ) e parece que as interfaces websvn mais recentes não fornecem um download de arquivo bruto (ou o temos configurado incorretamente ou sou cego). É mais fácil fazer isso do que checkout+ upapenas para baixar um arquivo.
Ribamar 27/11

12

Se você deseja visualizar o readme.txt em seu repositório sem fazer check-out:

$ svn cat http://svn.red-bean.com/repos/test/readme.txt
Este é um arquivo LEIA-ME. Você deveria ler isso.

Dica: Se sua cópia de trabalho está desatualizada (ou você tem modificações locais) e você deseja ver a revisão HEAD de um arquivo em sua cópia de trabalho, o svn cat buscará automaticamente a revisão HEAD quando você indicar um caminho:

$ cat foo.c
Este arquivo está na minha cópia local de trabalho e possui as alterações que eu fiz.

$ svn cat foo.c
Última revisão recente do repositório!

Fonte


Você também pode usar diretamente qualquer cliente HTTP. Seu navegador da Web ou uma ferramenta de linha de comando como curlou wget.
Dolmen

9

Segue-se uma solução equivalente da resposta aceita pelo TortoiseSVN (eu a escrevi em um documento interno para minha empresa quando estamos adotando o SVN recentemente). Eu pensei que seria útil compartilhar aqui também:

Fazendo check-out de um único arquivo: O Subversion não suporta check-out de um único arquivo, apenas o check-out de estruturas de diretório. (Referência: http://subversion.tigris.org/faq.html#single-file-checkout ). Isso ocorre porque, com todos os diretórios cujo check-out é feito como cópia de trabalho, os metadados referentes a modificações / revisões de arquivo são armazenados como uma pasta oculta interna (.svn / _svn). No momento, isso não é suportado (v1.6) para arquivos únicos.

Estratégia alternativa recomendada: você terá que fazer a parte do diretório de checkout apenas uma vez, depois disso, você poderá fazer o checkout diretamente de seus arquivos únicos. Faça uma verificação esparsa da pasta pai e da estrutura de diretórios. Um checkout esparso é basicamente o check-out apenas da estrutura de pastas sem preencher os arquivos de conteúdo. Portanto, você faz check-out apenas das estruturas de diretório e não precisa fazer check-out de TODOS os arquivos, como foi a preocupação. Referência: http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-checkout.html

Etapa 1 : Prossiga para o repositório do navegador

Etapa 2 : Clique com o botão direito do mouse na pasta pai dentro do repositório que contém todos os arquivos nos quais você deseja trabalhar e selecione Checkout.

Etapa 3 : na nova janela pop-up, verifique se o diretório do checkout aponta para o local correto no seu PC local. Também haverá um menu suspenso chamado "profundidade de checkout". Escolha “Somente este item” ou “Filhos imediatos, incluindo pastas”, dependendo da sua necessidade. A segunda opção é recomendada, pois, se você quiser trabalhar na pasta aninhada, poderá prosseguir diretamente da próxima vez, caso contrário, precisará seguir todo esse procedimento novamente para a pasta aninhada.

Etapa 4 : a (s) pasta (s) pai (s) agora deve estar disponível na pasta escolhida localmente e agora está sendo monitorada com o SVN (uma pasta oculta “.svn” ou “_svn” deve estar presente). Agora, dentro do repositório, clique com o botão direito do mouse no arquivo que você deseja retirar sozinho e selecione a opção “Atualizar item para revisão”. Agora, o arquivo único pode ser trabalhado e verificado novamente no repositório.

Eu espero que isso ajude.


8

Você pode fazer isso em duas etapas:

  1. Faça o check-out de um repositório SVN vazio com apenas meta informações:

    $ cd /tmp
    
    $ svn co --depth empty http://svn.your.company.ca/training/trunk/sql
    
  2. Execute svn uppara atualizar o arquivo especificado:

    $ svn up http://svn.your.company.ca/training/trunk/sql/showSID.sql
    

6

Uma atualização caso o que você realmente precisa possa ser coberto com a inclusão do arquivo no checkout de outra pasta.

Desde o SVN 1.6, você pode criar arquivos externos , um tipo de link svn. Isso significa que você pode ter outra pasta com versão que inclua um único arquivo. Também é possível confirmar alterações no arquivo em um checkout desta pasta.

É muito simples, faça o checkout da pasta que você deseja incluir no arquivo e adicione uma propriedade à pasta

svn propedit svn:externals .

com conteúdo como este:

file.txt /repos/path/to/file.txt

Depois que você confirmar isso, o arquivo aparecerá em checkouts futuros da pasta. Basicamente, funciona, mas existem algumas limitações, conforme descrito na documentação vinculada acima.


4

Vá para o repo-browser, clique com o botão direito do mouse no arquivo e use 'Salvar como', embora eu esteja usando o TortoiseSVN.


4
cd C:\path\dir
svn checkout https://server/path/to/trunk/dir/dir/parent_dir--depth empty
cd C:\path\dir\parent_dir
svn update filename.log

(Edite filename.log)

svn commit -m "this is a comment."

4

A resposta de Steve Jessop não funcionou para mim. Eu li os arquivos de ajuda do SVN e, se você tiver apenas uma imagem, provavelmente não deseja fazer check-in novamente, a menos que esteja fazendo o Photoshop, então exporte é um comando melhor do que o check-out, pois não é versionado (mas é menor).

E o ARG --thpth não deve estar vazio, mas com arquivos para obter os arquivos no diretório imediato. Então você obterá todos os campos, não apenas o, mas vazio não retorna nada do repositório.

 svn co --depth files <source> <local dest>

ou

svn export --depth files <source> <local dest>

Quanto às outras respostas, cat permite que você leia o conteúdo que é bom apenas para texto, não para imagens de todas as coisas.


1
O ponto principal --depth emptyera que os outros arquivos não deveriam ser retirados e você pode obter apenas um único arquivo svn up <source/file>. Com svn export, não há necessidade de fazer isso, basta especificar o arquivo.
Kevin Vermeer

@reemrevnivek - você está certo. bem, a pergunta que acabou de ser feita para um único arquivo, isso funciona sem o check-out de todo o arquivo da estrutura de diretórios, mesmo que esteja vazio.
Vass

4

Eu apenas navegava e exportava o arquivo único. Se você tiver acesso HTTP, basta usar o navegador da web para encontrar o arquivo e pegá-lo.

Se você precisar recuperá-lo depois de editá-lo, isso pode ser um pouco mais tedioso, mas tenho certeza de que pode haver uma svn importfunção ...


3

Faça algo parecido com isto:

mkdir <your directory>/repos/test

svn cat http://svn.red-bean.com/repos/test/readme.txt > <your directory>/repos/test/readme.txt

Basicamente, a idéia é criar o diretório em que você deseja obter o arquivo do SVN. Use o svn catcomando e redirecione a saída para o mesmo arquivo nomeado. Por padrão, o gato despeja informações no stdio.


2

Se você deseja apenas um arquivo sem informações de revisão, use

svn export <URL>

2

Com o Subversion 1.5, é possível verificar (todos) os arquivos de um diretório sem verificar nenhum subdiretório (os vários sinalizadores --thpth). Não é exatamente o que você pediu, mas uma forma de "menos que tudo".


2

Usando a técnica de verificação esparsa, você PODE verificar um arquivo específico que já foi retirado ou existe ... com um truque simples:

Após o checkout do nível superior do seu repositório usando a opção 'this item only', no Windows Explorer, você DEVE primeiro clicar com o botão direito do mouse no arquivo que precisa atualizar; escolha Repo Browser no menu de contexto; encontre esse arquivo novamente no navegador do repositório e clique com o botão direito do mouse. Agora você deve ver o "item de atualização para revisão" no menu de contexto.

Não tenho certeza se é um recurso não documentado ou simplesmente um bug. Levei um longo período após o trabalho para finalmente encontrar esse truque. Estou usando o TortoiseSVN 1.6.2.


2

Eu queria fazer check-out de um único arquivo em um diretório, que não fazia parte de uma cópia de trabalho.

Vamos obter o arquivo no seguinte URL: http: //subversion.repository.server/repository/module/directory/myfile

svn co  http://subversion.repository.server/repository/module/directory/myfile /**directoryb**

Então, verifiquei o diretório em questão que contém o arquivo de destino que eu queria acessar em um diretório fictício (digamos etcb para o URL que termina com /etc).

Depois esvaziei o arquivo .svn / entradas de todos os arquivos do diretório de destino que não precisava, para deixar apenas o arquivo que queria. Nesse arquivo .svn / inputs , você tem um registro para cada arquivo com seus atributos; portanto, deixe apenas o registro referente ao arquivo que você deseja obter e salvar.

Agora você só precisa copiar '' .svn '' para o diretório que será uma nova "cópia de trabalho". Então você só precisa:

cp .svn /directory
cd /directory
svn update myfile

Agora o diretório diretório está sob controle de versão. Não se esqueça de remover o diretório directoryb, que era apenas uma '' cópia de trabalho temporária ''.


Não é isso que o checkout esparso faz? Você realmente não deve invadir os arquivos no diretório .svn manualmente.
Lasse V. Karlsen

Talvez, mas resolveu o problema corretamente. Suponho que é assim que o gerenciamento de versões deve funcionar, sendo também capaz de manipular arquivos como extensão de diretórios. Experimente e me diga o que há de errado com a lógica. Eu sugeriria que a equipe de desenvolvimento do subversion estendesse o utilitário svn com esse recurso, resolveria os problemas de todos os que responderam a esse tópico.
hendergassler

2

Como nenhuma das outras respostas funcionou para mim, eu fiz isso usando este hack:

$ cd /yourfolder
svn co https://path-to-folder-which-has-your-files/ --depth files

Isso criará uma nova pasta local que possui apenas os arquivos do caminho remoto. Em seguida, você pode fazer um link simbólico para os arquivos que deseja ter aqui.


O OP perguntou sobre svn coum arquivo para evitar um diretório inteiro cheio de arquivos de imagem. Além disso, a adição de um link simbólico pode aumentar a complexidade, mover de um diretório temporário pode funcionar, mas você ainda precisa verificar o diretório inteiro de imagens para apenas uma imagem. @ steve-Jessop teve a idéia certa
Chris Marotta

2
@ChrisMarotta, o OP, fez a pergunta há 9 anos. Ninguém aqui está respondendo ao OP. Este é um tópico geral para esse tipo de problema e não tem mais nada a ver com o OP original. As pessoas estão vindo aqui para encontrar uma solução para o seu próprio problema. E quando o lerem, alguns deles estarão na minha situação em que essa foi a única solução adequada. Por isso eu publiquei.
Lacho Tomov 28/09

1
Estou feliz por esta resposta, me ajudou
Leos Literak 19/02

1

Este problema é coberto por:

http://subversion.tigris.org/issues/show_bug.cgi?id=823

Existe um script anexado que permite fazer check-out de um único arquivo do svn, fazer alterações e confirmar as alterações no repositório, mas você não pode executar o "svn up" para verificar o restante do diretório. Foi testado com svn-1.3, 1.4 e 1.6.


1

Se você quiser apenas exportar o arquivo e não precisar atualizá-lo mais tarde, poderá fazê-lo sem precisar usar os comandos SVN.

Usando o navegador de repositório TortoiseSVN , selecione o arquivo, clique com o botão direito do mouse e selecione " Copiar URL para a área de transferência ". Cole esse URL no seu navegador e, após o login, você será solicitado a baixar o arquivo.

Dessa forma, você também pode selecionar a revisão desejada e fazer o download de uma versão mais antiga do arquivo.

Observe que isso é válido se o seu servidor SVN tiver uma interface da web.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.