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

StackOverflow https://stackoverflow.com/questions/9272

  •  08-06-2019
  •  | 
  •  

Pergunta

Alguém tem um script ou alias para encontrar o não rastreado (na verdade:não adicionados) em uma árvore Perforce?

EDITAR:Atualizei a resposta aceita sobre esta, pois parece que o P4V adicionou suporte para isso na versão de janeiro de 2009.

Foi útil?

Solução

EDITAR: Por favor, use p4 status agora.Não há mais necessidade de pular aros.Veja @ColonelPanic responder.

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

Isso fará um pequeno processamento e, em seguida, exibirá uma visualização em árvore dividida de arquivos que não foram verificados, mas que apresentam diferenças em relação à versão do depósito ou que não foram registrados.Pode até haver algumas outras categorias que ele traz à tona.

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

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

EDITAR:ah, a pergunta foi feita especificamente sobre scripts, mas deixarei essa resposta aqui para garantir.

Outras dicas

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

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 ao seu cliente ou ao depósito do Perforce.eu usei ! -name '*~' para excluir arquivos que terminam com ~.

Ahh, um dos clássicos do Perforce :) Sim, é realmente uma pena que AINDA não exista 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 do cliente e, em seguida, tentar adicioná-los ao depósito.Você terminará 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 'encontrar.-type f -print' de uma linha de comando nix).

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

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

Existe um análogo de svn status ou git status?

Sim mas.

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

Sinto-me impelido a acrescentar uma resposta, uma vez que a resposta aceita, e algumas das outras, apresentam 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 perda de tempo e cometer erros seguindo a resposta aceita, mas IMHO incorreta.

---+ BREVE

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

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

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

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

Várias respostas forneceram scripts, muitas vezes envolvendo p4 fstat.Embora eu não tenha verificado todos esses scripts, costumo usar scripts semelhantes para compensar as deficiências de comandos forçosos, como p4 reconcile -n - por exemplo.muitas vezes descubro 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 contrapartida dos comandos de status em outros sistemas de controle de versão.

p4 status NÃO é uma consulta somente leitura. p4 status na verdade encontra o mesmo tipo de mudanças que p4 reconcile faz e os adiciona ao repositório. p4 status não parece ter -n opção de simulação como p4 reconcile faz.

Se você fizer p4 status, olhe os arquivos e pense "Ah, não preciso disso", então você terá que p4 revert eles se quiser continuar editando no mesmo espaço de trabalho.Ou então as mudanças que p4 status adicionado ao seu conjunto de alterações será verificado na próxima vez.

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

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

---+ P4V GUI

Na GUI p4v, o comando reconciliar encontra 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 alterações por padrão;mas você ainda pode querer ter o cuidado de fechar a janela de reconciliação após inspecioná-la, se não quiser confirmar as alterações.

Eu uso o seguinte em minha ferramenta que faz backup de quaisquer 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 /A-D"lista todos os arquivos nesta pasta ou abaixo dela (/S) em formato "básico" (/B) excluindo diretórios (/DE ANÚNCIOS).O "sed"muda caracteres perigosos para seus"%xx" (a la HTML) e o "p4 tem"comando verifica esta lista ("-x-") contra o servidor descartar 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á!

Alternativamente no P4Win, use a opção "" Arquivos locais não no depósito "no painel de visualização esquerdo.

Não uso muito o P4V, mas acho que o equivalente é selecionar "Ocultar arquivos do espaço de trabalho local" no menu suspenso de filtros da guia 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:enter image description here

Rápido e sujo:No p4v, clique com o botão direito na pasta em questão e adicione todos os arquivos abaixo dela a uma nova lista de alterações.A lista de alterações agora conterá todos os arquivos que não fazem parte do depósito.

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

  • p4 status
  • p4 opened
  • p4 diff -ds

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 faz não deseja usar a resposta dele para limpar seu espaço de trabalho.

Os seguintes usos p4 fstat (obrigado Mark Harrison) em vez de p4 have, e 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

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ê poderá criar um repositório 'git' local a partir do seu checkout.A partir de uma sincronização limpa e forçada, git init, adicione e confirme todos os arquivos localmente.O status do Git é rápido e mostrará arquivos não confirmados anteriormente.

O p4 fstat comando permite testar se um arquivo existe no espaço de trabalho, combinar com find para localizar arquivos a serem verificados como no exemplo Perl a seguir:

// 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', então foi removido da área de trabalho.Observe que o comando acima está sendo executado no modo de visualização (-n).

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

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

No P4V, no item de menu “Exibir”, escolha “Arquivos na pasta”, que abre uma nova guia no painel direito.Na extremidade direita das guias há um pequeno ícone que abre uma janela chamada "Arquivos na pasta" com 2 ícones.Selecione o ícone esquerdo que parece 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.Depois é só clicar com o botão direito no arquivo que deseja adicionar e escolher "Marcar para Adicionar...".Você pode verificar se ele está na guia "Pendente".Basta enviar normalmente (Ctrl+S).

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