Pergunta

Se eu excluir um arquivo em subversão, como posso olhar para sua história e conteúdo? Se eu tentar fazer svn cat ou svn log Em um arquivo inexistente, ele reclama que o arquivo não existe.

Além disso, se eu quisesse ressuscitar o arquivo, devo apenas svn add de volta?

(Perguntei especificamente sobre subversão, mas também gostaria de ouvir sobre como o bazar, o mercurial e o git lide com esse caso também.)

Foi útil?

Solução

Para obter o registro de um arquivo excluído, use

svn log -r lastrevisionthefileexisted

Se você deseja ressuscitar o arquivo e manter seu histórico de versão, use

svn copy url/of/file@lastrevisionthefileexisted -r lastrevisionthefileexisted path/to/workingcopy/file

Se você deseja apenas o conteúdo do arquivo, mas não versionado (por exemplo, para uma inspeção rápida), use

svn cat url/of/file@lastrevisionthefileexisted -r latrevisionthefileexisted > file

De qualquer forma, não use 'svn up' para obter um arquivo excluído de volta!

Outras dicas

Quando você quiser olhar para os arquivos antigos, você realmente deve saber a diferença entre:

svn cat http://server/svn/project/file -r 1234

e

svn cat http://server/svn/project/file@1234

A primeira versão olha para o caminho que é agora disponível como http: // server/svn/projeto/arquivo e recupera esse arquivo como foi na revisão 1234. (então esta sintaxe faz não trabalhar após um arquivo excluir).

A segunda sintaxe recebe o arquivo que estava disponível como http: // server/svn/projeto/arquivo na revisão 1234. então esta sintaxe FAZ Trabalhe em arquivos excluídos.

Você pode até combinar esses métodos para recuperar um arquivo disponível na revisão 2345 como http: // server/svn/projeto/arquivo Mas com o conteúdo como tinha em 1234 com:

svn cat http://server/svn/project/file@2345 -r 1234

Primeiro, encontre o número da revisão em que o arquivo foi excluído:

svn log -v > log.txt

Em seguida, olhe no log.txt (não um guru svn, para que eu não conheço uma maneira melhor) para uma linha com

D <deleted file>

E veja qual revisão foi. Então, como nas outras respostas, ressuscite o arquivo usando a revisão anterior.

Não é nada de especial em Git. Se você souber o nome do arquivo, poderá descobrir a alteração que a removeu com o log:

git log -n 1 -- filename

Em seguida, você pode usar esse comprometimento para obter o arquivo como existia antes da exclusão.

git checkout [last_revision]^ filename

Exemplo:

dhcp-120:/tmp/slosh 587% ls -l slosh.tac
ls: slosh.tac: No such file or directory
dhcp-120:/tmp/slosh 588% git log -n 1 -- slosh.tac
commit 8d4a1f1a94e4aa37c1cb9d329a140d08eec1b587
Author: Dustin Sallings <dustin@spy.net>
Date:   Mon Dec 15 11:25:00 2008 -0800

    Get rid of a .conf and replace it with .tac.
dhcp-120:/tmp/slosh 589% git checkout 8d4a1f^ slosh.tac
dhcp-120:/tmp/slosh 590% ll slosh.tac
-rw-------  1 dustin  wheel  822 Dec 30 12:52 slosh.tac

Observe que isso não coloca o arquivo de volta no controle de revisão. Ele simplesmente solta o arquivo como existia em seu estado final no local atual. Você pode adicioná -lo ou apenas inspecioná -lo ou o que for a partir desse ponto.

Uma solução usando apenas a GUI:

Se você souber o nome do arquivo, mas Não sei o seu último número de revisão ou mesmo seu caminho:

  1. Do navegador repo, faça um "log de show" na raiz
  2. HIT "SHOW All" (na parte inferior da caixa de diálogo de log)
  3. Digite o nome do arquivo na caixa de texto do filtro (na parte superior da caixa de diálogo de log)

Isso mostrará apenas as revisões em que o arquivo foi adicionado/modificado/excluído. Este é o seu histórico do arquivo.

Observe que, se o arquivo foi excluído excluindo uma de suas pastas pai, ele não terá uma entrada 'excluída' no log (e portanto a solução de MJY não funcionará). Nesse caso, sua entrada mais recente no log filtrada corresponderá ao seu conteúdo na exclusão.

svn log -v | grep -B50 YourDeletedFileName

Vai o caminho e a revisão de você. No Git (também verifica as renomeias):

git log --diff-filter=DR --name-only | grep -B50 YourDeletedFileName

Além da resposta de Dustin, se você deseja apenas examinar o conteúdo e não confira, no exemplo dele, você pode fazer:

$ git show 8d4a1f^:slosh.tac

O: separa uma revisão e um caminho nessa revisão, solicitando efetivamente um caminho específico em uma revisão específica.

Use este comando:

svn log -v | awk '/^r[0-9]+/ { rev = $1; }; / D .*filename_escaped_for_regex/ { print rev" "$2; };'

Isso listará todas as revisões que já excluíram todos os arquivos que correspondem ao padrão. Isto é, se você está pesquisando por leitura de arquivo, então tudo de /src/README, /src/README.first, e /some/deeply/hidden/directory/READMENOT será encontrado e listado.

Se seu nome do arquivo Contém barras (caminho), pontos ou outros caracteres regex especiais, não se esqueça de escapar para evitar incompatibilidade ou erros.

Se você não conhece o caminho para o arquivo excluído, você pode procurar para isso no caso muito pesado svn log comando:

svn log --search <deleted_file_or_pattern> -v

O comando provavelmente está martelando o servidor tanto quanto faria sem a opção de pesquisa, mas pelo menos o restante dos recursos envolvidos (incluindo seus olhos) seria meio aliviado, pois isso lhe dirá em qual revisão esse arquivo foi excluído. Em seguida, você pode seguir as outras dicas (principalmente usando o mesmo svn log comando, mas já em um caminho definido).

O pôster realmente fez 3 perguntas aqui:

  1. Como observo a história de um arquivo excluído na subversão?
  2. Como observo o conteúdo de um arquivo excluído na subversão?
  3. Como ressuscitar um arquivo excluído na subversão?

Todas as respostas que vejo aqui são para as perguntas 2 e 3.

A resposta para a pergunta 1 é:

svn log http://server/svn/project/file@1234

Você ainda precisa obter o número de revisão para quando o arquivo existiu pela última vez, o que é claramente respondido por outras pessoas aqui.

Ah, desde que estou aprendendo a usar o Bazaar, é algo que tentei. Sem sucesso, parece que você não pode Log e anote arquivos removidos atualmente... :-(

Tentou:

> bzr log -r 3 Stuff/ErrorParser.hta
bzr: ERROR: Path does not have any revision history: Stuff/ErrorParser.hta

mas curiosamente (e felizmente) eu posso fazer:

> bzr cat -r 3 Stuff/ErrorParser.hta

e:

> bzr diff -r 2..3 Stuff/ErrorParser.hta

e como sugerido no bug acima:

> bzr log -v | grep -B 1 ErrorParser

(ajustar -B (--before-context) parâmetro conforme necessário).

Você precisaria especificar uma revisão.

svn log -r <revision> <deleted file>

Se você quer olhar para a história de um arquivo antes de ser renomeado, como mencionado em um comentário aqui você pode usar

git log --follow -- current_file_name

Eu queria uma resposta, eu mesmo. Experimente o seguinte para que a saída exclua apenas de svn log.

svn log --stop-on-copy --verbose [--limit <limit>] <repo Url> | \
awk '{ if ($0 ~ /^r[0-9]+/) rev = $0 }
  { if ($0 ~ /^ D /) { if (rev != "") { print rev; rev = "" }; print $0 } }'

Isso filtra a saída de log através Awk. Awk Buffers Cada linha de revisão encontra, produzindo -a somente quando um registro de exclusão é encontrado. Cada revisão é apenas uma saída uma vez, portanto, vários exclusão em uma revisão são agrupados (como no padrão svn log resultado).

Você pode especificar um --limit Para reduzir a quantidade de registros retornados. Você também pode remover o --stop-on-copy, como necessário.

Eu sei que há queixas sobre a eficiência de analisar todo o log. Eu acho que esta é uma solução melhor do que o Grep e seu "lançar uma ampla rede" -B opção. Não sei se é mais eficiente, mas não consigo pensar em uma alternativa a svn log. É semelhante à resposta do @Alexander Amelkin, mas não precisa de um nome específico. É também o meu primeiro Awk Script, então pode não ser convencional.

Escrevi um script PHP que copia o log SVN de todos os meus repositórios em um banco de dados MySQL. Agora posso fazer pesquisas completas de texto em meus comentários ou nomes de arquivos.

Você pode encontrar a última revisão que fornece o arquivo usando a pesquisa binária. Eu criei um simples /bin/bash script para isso:

function svnFindLast(){
 # The URL of the file to be found
 local URL="$1"
 # The SVN revision number which the file appears in (any rev where the file DOES exist)
 local r="$2"
 local R
 for i in $(seq 1 "${#URL}")
  do
   echo "checkingURL:'${URL:0:$i}'" >&2
   R="$(svn info --show-item revision "${URL:0:$i}" 2>/dev/null)"
   echo "R=$R" >&2
   [ -z "$R" ] || break
 done
 [ "$R" ] || {
  echo "It seems '$URL' is not in a valid SVN repository!" >&2
  return -1
 }
 while [ "$r" -ne "$R" -a "$(($r + 1))" -ne "$R" ]
 do
  T="$(($(($R + $r)) / 2))"
  if svn log "${URL}@${T}" >/dev/null 2>&1
   then
    r="$T"
    echo "r=$r" >&2
   else
    R="$T"
    echo "R=$R" >&2
  fi
 done
 echo "$r"
}

Suponha que seu arquivo tenha sido nomeado como ~/src/a/b/c/excluído.file

cd ~/src/a/b/c  # to the directory where you do the svn rm or svn mv command
#cd ~/src   # if you forget the correct directory, just to the root of repository
svn log -v | grep -w -B 9 deleted.file | head  # head show first 10 lines

Saída de amostra, encontrou -a em R90440

...
r90440 | user | 2017-02-03 11:55:09 +0800 (Fri, 03 Feb 2017) | 4 lines
Changed paths:
  M /src/a/b/c/foo
  M /src/a/b/c/bar
  D /src/a/b/c/deleted.file

Copie-o de volta para a versão anterior (90439 = 90440-1)

svn cp URL_of_deleted.file@90439 .
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top