Como encontrar arquivos não rastreados em uma árvore Perforce? (análogo ao status svn)

87

Alguém tem um script ou apelido para localizar arquivos não rastreados (realmente: não adicionados) em uma árvore do Perforce?

EDIT: Eu atualizei a resposta aceita neste, pois parece que P4V adicionou suporte para isso na versão de janeiro de 2009.

David Joyner
fonte
11
Não consigo imaginar como é que a ferramenta de SCM corporativa mais usada não tem essa funcionalidade. Provavelmente, todos os seus desenvolvedores estão usando apenas a GUI.
Sorin
3
Oh pelo amor de Deus !!!! O aceito p4 statusnão apenas ENCONTRA arquivos não rastreados, mas na verdade COMEÇA A rastreá-los. Ou p4 statusseja, não é uma consulta somente leitura, como se poderia suspeitar pelo nome, mas na verdade é um comando que muda coisas - não os arquivos do espaço de trabalho. Isso NÃO é o que um comando de status deve fazer, e NÃO o que svn statusfaz. A coisa mais próxima que posso encontrar svn statusé p4 reconcile -na- -a para dizer "arquivos que devem ser adicionados", -n para dizer "não mude realmente nada". /// Eu originalmente disse algo muito mais forte.
Krazy Glew
1
Eu revivi stackoverflow.com/questions/9642531/… , que foi marcado incorretamente como uma duplicata de stackoverflow.com/questions/9272/… , como uma nova pergunta (Qual é o comando p4 equivalente a algo como git / hg / bzr / svn status? (Dica: não p4 status) , e respondi eu mesmo. Melhor bem
Krazy Glew
Ambos p4 reconcilee p4 statussão lentos como o inferno, enquanto git statusconcluem a execução em 1-3 segundos.
zwcloud

Respostas:

81

EDIT: Por favor, use p4 statusagora. Não há mais necessidade de pular através de aros. Veja a resposta de @CoronelPanic .

Na versão de janeiro de 2009 do P4V, você pode clicar com o botão direito em qualquer pasta na árvore da sua área de trabalho e clicar em "reconciliar trabalho offline ..."

Isso fará um pequeno processamento e, em seguida, exibirá uma visualização em árvore dividida dos arquivos que não foram retirados, mas têm diferenças da versão do depósito ou não foram registrados de forma alguma. Pode até haver algumas outras categorias que ele apresenta.

Você pode clicar com o botão direito do mouse nos arquivos nesta visualização e verificá-los, adicioná-los ou até mesmo revertê-los.

É uma ferramenta muito útil que me salvou algumas vezes.

EDIT: ah a pergunta feita sobre scripts especificamente, mas vou deixar esta resposta aqui para o caso.

tenpn
fonte
Adicionada uma solução PowerShell nesta questão: stackoverflow.com/questions/3217152/…
tenpn
Isso compara cada arquivo com a versão no repositório? Tenho um repositório grande e uma conexão lenta (quando trabalho em casa). Isso pode levar uma eternidade!
gdw2
Não acho que seja uma diferença completa, mas não é rápido.
tenpn
10
Oh pelo amor de Deus !!!! p4 statusnão apenas ENCONTRA arquivos não rastreados, mas na verdade COMEÇA A rastreá-los. Ou p4 statusseja, não é uma consulta somente leitura, como se poderia suspeitar pelo nome, mas na verdade é um comando que muda coisas - não os arquivos do espaço de trabalho. Isso NÃO é o que um comando de status deve fazer, e NÃO o que svn statusfaz. A coisa mais próxima que posso encontrar svn statusé p4 reconcile -na- -a para dizer "arquivos que devem ser adicionados", -n para dizer "não mude realmente nada". /// Eu originalmente disse algo muito mais forte.
Krazy Glew,
1
p4 statusé basicamente um sinônimo de p4 reconcile -n. Talvez você tenha executado o p4 status -Aque é sinônimo de p4 reconcile?
Samwise
50

No Linux, ou se você tiver o gnu-tools instalado no Windows:

find . -type f -print0 | xargs -0 p4 fstat >/dev/null

Isso mostrará uma mensagem de erro para cada arquivo não contabilizado. Se você deseja capturar essa saída:

find . -type f -print0 | xargs -0 p4 fstat >/dev/null 2>mylogfile
Mark Harrison
fonte
1
Redirecionar stderr para stdout permitirá que você execute filtragem adicional ou outras operações. Por exemplo, para ver uma lista rolável de arquivos Java: encontre. -tipo f -print0 | xargs -0 p4 fstat 2> & 1> / dev / null | grep '\ .java' | menos
Jon Nadal
2
Isso leva muito tempo no meu espaço de trabalho de 60 mil arquivos. Eu escrevi um script Python que faz o mesmo trabalho em menos de 10 segundos: p5 . Ele também suporta .p4ignoree pode visualizar e editar automaticamente arquivos não rastreados / alterados / excluídos.
hamstergene
@hamstergene, muito bom!
Mark Harrison,
Escreveu um pequeno script que faz exatamente isso se alguém estiver interessado (incluindo o argumento dir, argumento de profundidade máxima e saída para stdout).
Arnon Zilca
Obrigado; Eu achei isso útil! Observe que isso não lida com links simbólicos ( find . -type l) e fornece uma saída enganosa para arquivos P4 adicionados à força porque contêm os caracteres @ou %. No entanto, esses arquivos são minoria, portanto, uma revisão manual desses casos extremos funcionará na maioria dos casos.
CJBS de
19

No Unix:

find -type f ! -name '*~' -print0| xargs -0 p4 fstat 2>&1|awk '/no such file/{print $1}'

Isso imprimirá uma lista de arquivos que não foram adicionados em seu cliente ou no depósito Perforce. Eu costumava ! -name '*~'excluir arquivos que terminam com ~.

ahu
fonte
12

Ahh, um dos clássicos do Perforce :) Sim, é realmente uma pena que AINDA não haja uma maneira fácil de fazer isso embutido nos comandos padrão.

A maneira mais fácil é executar um comando para localizar todos os arquivos na raiz de seus clientes e, em seguida, tentar adicioná-los ao depósito. Você acabará com uma lista de alterações de todos os novos arquivos e os arquivos existentes serão ignorados.

Por exemplo, dir / s / b / AD | p4 -x - adicionar

(use 'find. -type f -print' em uma linha de comando nix).

Se você quiser uma lista física (no console ou arquivo), então você pode canalizar os resultados de uma comparação (ou adicionar se você também quiser em uma lista de alterações).

Se você estiver executando isso no P4Win, você pode usar $ r para substituir a raiz do cliente do espaço de trabalho atual.

Andrew Grant
fonte
11

Existe um análogo de svn statusou git status?

Sim, MAS .

A partir da versão 2012.1 do Perforce, existe o comando p4 statuse no P4V 'reconciliar trabalho offline'. No entanto, ambos são muito lentos. Para excluir arquivos irrelevantes, você precisará gravar um p4ignore.txtarquivo por https://stackoverflow.com/a/13126496/284795

Coronel Panic
fonte
1
Houve várias melhorias de desempenho p4 statusdesde a versão 2012.1. Se você tem se mantido afastado p4 statusdevido a problemas de desempenho, pode valer a pena testá-lo novamente para ver como ele se comporta agora.
Bryan Pendleton
7

Sinto-me impelido a acrescentar uma resposta, uma vez que a resposta aceita, e algumas das outras, têm o que considero um problema significativo: eles não entendem a diferença entre um comando de consulta somente leitura e um comando que faz alterações.

Não espero nenhum crédito por esta resposta, mas espero que ajude outras pessoas a evitar perder tempo e cometer erros, seguindo a resposta aceita, mas incorreta de IMHO.

--- + BREVE

Provavelmente, a maneira mais conveniente de localizar todos os arquivos não rastreados em um espaço de trabalho forçado é p4 reconcile -na.

-a diz "dê-me arquivos que não estão no repositório, ou seja, que devem ser adicionados".

-ndiz "não faça alterações" - ou seja, um ensaio. (Embora as mensagens possam dizer "aberto para adicionar", mentalmente você deve interpretar isso como "seria aberto para adicionar se não fosse -n")

Provavelmente, a maneira mais conveniente de encontrar todas as alterações locais feitas offline - não apenas os arquivos que podem precisar ser adicionados, mas também os arquivos que podem precisar ser excluídos, ou que foram alterados sem serem abertos para edição através do p4 edit, é p4 reconcile -n.

Várias respostas forneceram scripts, muitas vezes envolventes p4 fstat. Embora eu não tenha verificado todos esses scripts, muitas vezes uso scripts semelhantes para compensar as deficiências dos comandos do perforce, como p4 reconcile -n- por exemplo, muitas vezes eu acho que quero caminhos locais em vez de caminhos de depósito Perforce ou caminhos de espaço de trabalho.

--- + AVISO

p4 status NÃO é a contraparte dos comandos de status em outros sistemas de controle de versão.

p4 statusNÃO é uma consulta somente leitura. p4 statusna verdade, encontra o mesmo tipo de alterações que o p4 reconcilefaz e as adiciona ao repositório. p4 statusnão parece ter uma -nopção de simulação como p4 reconcilefaz.

Se você fizer isso p4 status, olhe para os arquivos e pense "Oh, eu não preciso deles", então você terá que fazê- p4 revertlos se quiser continuar editando na mesma área de trabalho. Ou então, as alterações p4 statusadicionadas ao seu changeset serão verificadas na próxima vez.

Parece haver pouca ou nenhuma razão para usar em p4 statusvez de p4 reconcile -n, exceto para alguns detalhes do espaço de trabalho local vs nome do caminho do depósito.

Só posso imaginar que quem escolheu 'status' para um comando não somente leitura tinha um comando limitado do idioma inglês e outras ferramentas de controle de versão.

--- + P4VGUI

Na GUI p4v, o comando reconciliar encontra as alterações locais que podem precisar ser adicionadas, excluídas ou abertas para edição. Felizmente, ele não os adiciona a uma lista de mudanças por padrão; mas você ainda pode querer ter o cuidado de fechar a janela de reconciliação após inspecioná-la, se você não quiser confirmar as alterações.

Krazy Glew
fonte
O status p4 não parece adicionar arquivos. parece funcionar como e está documentado como 'reconciliar -n'. tem certeza que muda as coisas?
kdubs
4

Eu uso o seguinte em minha ferramenta que faz backup de todos os arquivos no espaço de trabalho que sejam diferentes do repositório (para Windows). Ele lida com alguns casos estranhos que o Perforce não gosta muito, como espaços em branco incorporados, estrelas, porcentagens e marcas de hash:

dir /S /B /A-D | sed -e "s/%/%25/g" -e "s/@/%40/g" -e "s/#/%23/g" -e "s/\*/%2A/g" | p4 -x- have 1>NUL:

" dir / S / B / AD " lista todos os arquivos nesta pasta ou abaixo desta ( / S ) no formato "vazio" ( / B ) excluindo os diretórios (/ AD ). O " sed " muda os caracteres perigosos para sua forma " % xx " (a la HTML), e o comando " p4 have " verifica esta lista (" -x- ") contra o servidor descartando qualquer coisa sobre os arquivos que ele realmente localiza no repositório (" 1> NUL: "). O resultado é um monte de linhas como:

Z:\No_Backup\Workspaces\full\depot\Projects\Archerfish\Portal\Main\admin\html\images\nav\navxx_background.gif - file(s) not on client.

Et voilà!

Ross Patterson
fonte
Esta é uma ótima solução e ainda funciona com a versão P4 2015.1
Rian Sanderson
muito rápido! find / xargs fica sem memória e lento. Recupere para dobrar% 's ao adicionar ao arquivo .bat.
kevinf de
4

Como alternativa a partir do P4Win, use a opção "" Arquivos locais que não estão no depósito "no painel de visualização à esquerda.

Não uso muito o P4V, mas acho que o equivalente é selecionar "Ocultar arquivos do espaço de trabalho local" no menu suspenso de filtro da guia de visualização do espaço de trabalho.p4 help fstat

No P4V 2015.1, você encontrará essas opções no botão de filtro como este: insira a descrição da imagem aqui

Greg Whitfield
fonte
Isso mostra apenas os arquivos no diretório atual, infelizmente :(
JP P.
2

Quick 'n Dirty: Em p4v, clique com o botão direito do mouse na pasta em questão e adicione todos os arquivos abaixo dela em uma nova lista de alterações. A lista de mudanças agora conterá todos os arquivos que atualmente não fazem parte do depósito.

gdw2
fonte
1

Os comandos a seguir produzem uma saída semelhante a um status, mas nenhum é totalmente equivalente a svn statusou git status, fornecendo um resumo de uma linha do status de cada arquivo:

  • p4 status
  • p4 opened
  • p4 diff -ds
Ruibarbo
fonte
0

Não tenho pontos de reputação suficientes para comentar, mas a solução de Ross também lista arquivos que estão abertos para adição. Você provavelmente não quer usar a resposta dele para limpar seu espaço de trabalho.

O seguinte usa p4 fstat(obrigado Mark Harrison) em vez de p4 havee lista os arquivos que não estão no depósito e não estão abertos para adição.

dir /S /B /A-D | sed -e "s/%/%25/g" -e "s/@/%40/g" -e "s/#/%23/g" -e "s/\*/%2A/g" | p4 -x- fstat 2>&1 | sed -n -e "s/ - no such file[(]s[)]\.$//gp"

=== Jac

Jac Goudsmit
fonte
0

Método rápido, mas pouco ortodoxo. Se a base de código não adicionar novos arquivos / alterar a visualização com muita frequência, você pode criar um repositório 'git' local fora de seu checkout. A partir de uma sincronização limpa do perforce, git init, adicione e confirme todos os arquivos localmente. O status do Git é rápido e mostrará arquivos não confirmados anteriormente.

kevinf
fonte
0

O p4 fstatcomando permite que você teste se um arquivo existe no espaço de trabalho, combine com findpara localizar arquivos para verificar como no seguinte exemplo de Perl:

// throw the output of p4 fstat to a 'output file'
// find:
//  -type f  :-  only look at files,
//  -print0  :-  terminate strings with \0s to support filenames with spaces
// xargs:
//  Groups its input into command lines,
//  -0       :-  read input strings terminated with \0s
// p4:
//  fstat    :-  fetch workspace stat on files

my $status=system "(find . -type f -print0 | xargs -0 p4 fstat > /dev/null) >& $outputFile";

// read output file
open F1, $outputFile or die "$!\n";

// iterate over all the lines in F1
while (<F1>) {
  // remove trailing whitespace
  chomp $_;

  // grep lines which has 'no such file' or 'not in client'
  if($_ =~ m/no such file/ || $_ =~ m/not in client/){

     // Remove the content after '-'
     $_=~ s/-\s.*//g;

     // below line is optional. Check ur output file for more clarity.
     $_=~ s/^.\///g;

     print "$_\n";
  }
}

close F1;

Ou você pode usar p4 reconcile -n -m ...

Se estiver 'aberto para exclusão', será removido do espaço de trabalho. Observe que o comando acima está sendo executado no modo de visualização ( -n).

sido um
fonte
1
Por favor, não apenas lance algum código sem qualquer explicação como resposta, mas adicione alguma explicação para ajudar o OP a entender o código e aprender algo. :)
Markus
0

Eu precisava de algo que funcionasse em Linux, Mac ou Windows. Então, escrevi um script Python para ele. A ideia básica é iterar por meio de arquivos e executar p4 fstatem cada um deles. (claro, ignorando dependências e pastas tmp)

Você pode encontrá-lo aqui: https://gist.github.com/givanse/8c69f55f8243733702cf7bcb0e9290a9

dar
fonte
-1

No P4V, no item de menu "Exibir", escolha "Arquivos na pasta", que abre uma nova guia no painel direito. Na extrema direita das guias, há um pequeno ícone que abre uma janela chamada "Arquivos na pasta" com 2 ícones. Selecione o ícone esquerdo que se parece com um funil e você verá várias opções. Escolha "Mostrar itens que não estão no depósito" e todos os arquivos da pasta serão exibidos. Em seguida, basta clicar com o botão direito no arquivo que deseja adicionar e escolher "Marcar para adicionar ...". Você pode verificar se ele está lá na guia "Pendente". Basta enviar normalmente (Ctrl + S).

Engenheiro
fonte