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.
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.
p4 status
não apenas ENCONTRA arquivos não rastreados, mas na verdade COMEÇA A rastreá-los. Ou p4 status
seja, 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 status
faz. 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.
p4 status
) , e respondi eu mesmo. Melhor bem
p4 reconcile
e p4 status
são lentos como o inferno, enquanto git status
concluem a execução em 1-3 segundos.
Respostas:
EDIT: Por favor, use p4 status
agora. 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.
p4 status
não apenas ENCONTRA arquivos não rastreados, mas na verdade COMEÇA A rastreá-los. Ou p4 status
seja, 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 status
faz. 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.
p4 status
é basicamente um sinônimo de p4 reconcile -n
. Talvez você tenha executado o p4 status -A
que é sinônimo de p4 reconcile
?
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
.p4ignore
e pode visualizar e editar automaticamente arquivos não rastreados / alterados / excluídos.
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.
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.
Existe um análogo de
svn status
ougit 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á gravar um p4ignore.txt
arquivo por https://stackoverflow.com/a/13126496/284795
p4 status
desde a versão 2012.1. Se você tem se mantido afastado p4 status
devido a problemas de desempenho, pode valer a pena testá-lo novamente para ver como ele se comporta agora.
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".
-n
diz "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 status
NÃO é uma consulta somente leitura. p4 status
na verdade, encontra o mesmo tipo de alterações que o p4 reconcile
faz e as adiciona ao repositório. p4 status
não parece ter uma -n
opção de simulação como p4 reconcile
faz.
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 revert
los se quiser continuar editando na mesma área de trabalho. Ou então, as alterações p4 status
adicionadas ao seu changeset serão verificadas na próxima vez.
Parece haver pouca ou nenhuma razão para usar em p4 status
vez 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.
--- + P4V
GUI
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.
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à!
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:
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 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ê 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.
O p4 fstat
comando permite que você teste se um arquivo existe no espaço de trabalho, combine com find
para 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
).
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 fstat
em cada um deles. (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 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).