Você pode “ignorar” um arquivo no Perforce?


101

Às vezes, uso o recurso 'Reconciliar trabalho offline ...' encontrado no P4V IDE do Perforce para sincronizar todos os arquivos em que trabalhei enquanto desconectado do depósito P4. Ele abre outra janela que executa uma 'Diferença de pasta'.

Tenho arquivos que nunca quero registrar no controle de origem (como os encontrados na pasta bin, como DLLs, saída gerada por código, etc.) Existe uma maneira de filtrar esses arquivos / pastas para que não apareçam como "novos"? adicionado. Eles tendem a bagunçar a lista de arquivos nos quais estou realmente interessado. O P4 tem o equivalente ao recurso 'ignorar arquivo' do Subversion?


Você poderia fornecer um exemplo da saída do CVS para que possamos ver o que você quer dizer e por que as respostas fornecidas não fazem o que você deseja?
Greg Whitfield,

2
No fórum de ideias do Perforce, você pode votar em uma sugestão de listas de ignorados no estilo Git. P4ideax.com/ideas/15/ignore-support
Coronel Panic

Clique em "Reconciliar Trabalho Offline", desmarque "Arquivos locais não estão no depósito", pressione "Reconciliar". Contanto que você não esteja adicionando arquivos, esta é provavelmente a solução mais rápida.
pista de

Respostas:


59

A partir da versão 2012.1, Perforce oferece suporte à P4IGNOREvariável de ambiente. Atualizei minha resposta a esta pergunta sobre ignorar diretórios com uma explicação de como isso funciona. Então percebi esta resposta, que agora é supérflua, eu acho.


Supondo que você tenha um cliente denominado "CLIENTE", um diretório denominado "foo" (localizado na raiz do projeto), e deseja ignorar todos os arquivos .dll nessa árvore de diretório, você pode adicionar as seguintes linhas à visualização do seu espaço de trabalho para realizar isto:

- // depot / foo / *. dll //CLIENT/foo/*.dll
- // depot / foo /.../*. dll //CLIENT/foo/.../*.dll

A primeira linha os remove do diretório "foo" e a segunda linha os remove de todos os subdiretórios. Agora, quando você 'Reconciliar trabalho offline ...', todos os arquivos .dll serão movidos para as pastas "Arquivos excluídos" na parte inferior da exibição de diferenças da pasta. Eles estarão fora do seu caminho, mas ainda podem visualizá-los e manipulá-los se você realmente precisar.

Você também pode fazer isso de outra forma, o que irá reduzir sua pasta "Arquivos Excluídos" para apenas um, mas você não poderá manipular nenhum dos arquivos que ela contém porque o caminho estará corrompido (mas se você apenas os quiser do seu caminho, não importa).

- // depot / foo ... / *. dll //CLIENT/foo.../*.dll

30
Embora isso funcione, não é muito útil, pois você terá que colocar essas linhas em cada área de trabalho que criar.
dgrant

6
Nota: isso não funciona para o trabalho normal de reconciliação offline de p4v. Os "arquivos excluídos" parecem estar apenas na janela de reconciliação "avançada" ...
Catskul

6
O filtro de exclusão não funciona dentro da Reconcile Offline Workcaixa de diálogo. Funciona se você abri-lo por dentro, Advanced Reconcile...mas é inútil porque em 99,9% das vezes você não precisa ou deseja usar o diálogo avançado.
Sorin

12
@raven: 1) (Exemplo :) Alguns projetos usam pastas bin / obj em cada projeto em vez de colocá-los em um local central. (Conclusão generalizada :) A suposição de Perforce de que todos os arquivos intermediários são colocados em um local de espaço de trabalho facilmente excluído é um design desnecessariamente restritivo para um VCS fazer. 2) Alguns projetos envolvem cache local e / ou outros arquivos gerados por usuário na estrutura de diretório (por exemplo, o cache * .ncb IntelliSense). A incapacidade de excluí-los como uma política comum prejudica gravemente os recursos Reconcile Offline Work e Diff Folders.
Sam Harwell

6
Este problema específico está me matando.
Warren P,

47

Sim mas.

Perforce versão 2012.1 adicionou um recurso conhecido como p4ignore , inspirado no Git. No entanto, os desenvolvedores do Perforce fizeram uma mudança no comportamento, sem justificativa, que tornou o recurso muito menos útil.

Enquanto o Git pega regras de todos os .gitignorearquivos, Perforce não sabe onde procurar até que você especifique um nome de arquivo em uma variável de ambiente P4IGNORE. Essa liberdade é uma maldição. Você não pode hackear dois repositórios que usam nomes diferentes para seus arquivos ignorar.

Além disso, o recurso de ignorar do Perforce não funciona. Você pode configurá-lo facilmente, mas outras pessoas não se beneficiam, a menos que optem explicitamente. Um contribuidor que não o fez pode acidentalmente enviar arquivos indesejados (por exemplo, uma binpasta criada por um script de construção).

O recurso de ignorar do Git é ótimo porque funciona na caixa. Se os .gitignorearquivos forem adicionados ao repositório ( todos fazem isso ), eles funcionarão para todos. Ninguém publicará acidentalmente sua chave privada.

Curiosamente, a documentação do Perforce mostra '.p4ignore' como um exemplo de regra para ignorar, que é ao contrário! Se as regras forem úteis, elas devem ser compartilhadas como parte do repositório.


Perforce ainda poderia ser bom no recurso. Escolha uma convenção para os nomes de arquivo, digamos p4ignore.txt, para que o recurso funcione perfeitamente. Elimine a P4IGNOREvariável de ambiente, é contraproducente. Edite os documentos para incentivar os desenvolvedores a compartilhar regras úteis. Permita que os usuários escrevam regras pessoais em um arquivo em sua pasta pessoal, como o Git faz .

Se você conhece alguém na Perforce, envie esta postagem por e-mail.


2
Obrigado pela clarificação. Tentei usar .p4ignore com P4VS, mas minha solução, que deveria ser ignorada, não foi ignorada. Primeiro pensei que estava fazendo algo errado. Agora eu sei melhor.
Michael S.

1
@gentlesea, a partir do Perforce 2013.1, o recurso de ignorar finalmente funciona no aplicativo gráfico.
Coronel Panic

2
Discussão 'Faça o recurso ignorar funcionar na caixa' em p4ideax.com/ideas/17856/…
Coronel Panic

1
Para variáveis ​​de configuração que diferem com base no espaço de trabalho que você está usando, tente usar arquivos P4CONFIG. Em seguida, você pode fazer com que seu arquivo P4CONFIG especifique um valor P4IGNORE diferente conforme você se move de uma área de trabalho para outra.
Bryan Pendleton

2
Perforce não sabe como construir software adequado, eles não entendem nem mesmo o básico. É por isso que todo mundo que está preso ao sonho sonha em mudar para o git.
Pavel P

22

Isso funciona a partir do Perforce 2013.1, o novo mecanismo P4IGNORE foi adicionado pela primeira vez na versão 2012.1, descrito no blog do Perforce aqui:

https://www.perforce.com/blog/new-20121-p4ignore

Conforme descrito atualmente, você define uma variável de ambiente "P4IGNORE" para um nome de arquivo que contém uma lista dos arquivos a serem ignorados.

Então você pode conferir para ver se gosta.


1
Você também pode incluir nomes de diretório, não apenas nomes de arquivo.
ashes999

Como mencionado anteriormente: infelizmente, você TEM que definir P4IGNORE.
Technophile

1
Consertei o link @DerMike - acho que o Perforce mudou os URLs dos blogs.
svec

7

Se você deseja uma solução que se aplique a todos os espaços de trabalho sem precisar ser copiada, você (ou seu administrador de sistema) pode recusar o envio desses tipos de arquivo usando linhas como a abaixo na tabela de proteção p4:

write user * * -//.../*.suo
write user * * -//.../*.obj
write user * * -//.../*.ccscc

Lembro-me de fazer isso antes, mas não tenho as permissões necessárias para testar isso aqui. Confira o guia Sysadmin do Perforce e experimente


3
Infelizmente, isso causa erros no envio, em vez de ignorar a visualização de reconciliação. Portanto, ele pode manter certos arquivos fora de um repositório, mas não pode ajudar seus usuários a não verem ruído.
Warren P

6

Perforce Streams torna mais fácil ignorar arquivos, a partir da versão 2011.1. De acordo com a documentação, você pode ignorar certas extensões ou certos caminhos em seu diretório.

De p4 help stream

Ignored: Optional; a list of file or directory names to be ignored in
                 client views. For example:

                     /tmp      # ignores files named 'tmp'
                     /tmp/...  # ignores dirs named 'tmp'
                     .tmp      # ignores file names ending in '.tmp'

                 Lines in the Ignored field may appear in any order.  Ignored
                 names are inherited by child stream client views.

Isso essencialmente faz o que a resposta de @raven especifica, mas é mais fácil com streams, já que se propaga automaticamente para cada espaço de trabalho que usa esse stream. Também se aplica a qualquer fluxo herdado do fluxo no qual você especifica os tipos de ignorar.

Você pode editar o stream p4 stream //stream_depot/stream_nameou clicando com o botão direito do mouse no stream na visualização de stream do p4v.

E, como observou @svec, a capacidade de especificar ignorar arquivos por espaço de trabalho estará disponível em breve e, na verdade, está no P4 2012.1 beta.


Sim, isso funciona para mim compartilhar as configurações de "ignorar" em uma equipe (estou usando a página 4 2013.2). Observe que ele só funciona em um depósito habilitado para fluxos. (Se você pode propagar a variável de ambiente P4IGNORE = .p4ignore em sua equipe, essa é provavelmente a melhor solução.)
yoyo

1
Observe que o campo Ignorado para um fluxo pode ser usado para ignorar uma pasta, arquivo ou extensão de arquivo específica, mas o suporte a curingas é limitado e não há como ignorar uma pasta inteira e "cancelar ignorar" arquivos ou subpastas específicos. (A partir da versão do servidor p4 2013.2)
yoyo

3

A sugestão de Will de usar .p4ignoreapenas parece funcionar com o plugin do WebSphere Studio (P4WSAD). Eu apenas tentei na minha caixa do Windows local e quaisquer arquivos e diretórios que listei não foram ignorados.

A sugestão da Raven de modificar as especificações do cliente é a maneira correta no Perforce. A organização adequada de seu código / dados / executáveis ​​e arquivos de saída gerados tornará o processo de exclusão de arquivos do check-in muito mais fácil.

Como uma abordagem mais draconiana, você sempre pode escrever um gatilho de envio que rejeitará o envio de listas de alterações se elas contiverem um determinado arquivo ou arquivos com uma determinada extensão, etc.


15
Eu discordo completamente de toda a declaração "Organização adequada do seu código ...". O fato da questão é que seguir a convenção de Perforce de edição do espaço de trabalho exige que cada usuário faça a alteração. Considerando que, um arquivo .p4ignore verdadeiro só seria criado / gerenciado uma vez.
Mike

9
Ah, e sem falar que você gosta de ramificar seu código? Boa sorte mantendo seus espaços de trabalho para cada ramo. Isso parece divertido!
Mike

2

RESPOSTA HISTÓRICA - não está mais correta. Na época em que isso foi escrito originalmente, era verdade;

Você não pode escrever e fazer check-in de um arquivo que o servidor usará para fazer ignorar regras; O padrão geral do arquivo glob ou regexp é ignorado forçosamente.

Outras respostas têm configurações globais de servidor que são globais (e não por pasta). As outras respostas mostram coisas que podem funcionar para você, se você deseja uma linha em sua visualização por pasta vezes o número de extensões que deseja ignorar nessa única pasta, ou que fornecem esse recurso apenas em plug-ins do WebSphere Studio ou fornecem capacidade para o servidor administradores, mas não está disponível para os usuários.

Resumindo, acho o Perforce muito fraco nessa área. Embora eu aprecie que aqueles que usam o plug-in do Eclipse possam usar .p4ignore, e eu acho isso ótimo, isso deixa aqueles de nós que não usam , no escuro.

ATUALIZAÇÃO: Veja a resposta aceita para o novo recurso P4IGNORE adicionado em meados de 2012.


1

Achei mais fácil reconciliar o trabalho offline usando um script BASH como este:

#!/bin/bash
# reconcile P4 offline work, assuming P4CLIENT is set
if [ -z "$P4CLIENT" ] ; then echo "P4CLIENT is not set"; exit 1; fi
unset PWD # confuses P4 on Windows/CYGWIN

# delete filew that are no longer present
p4 diff -sd ... | p4 -x - delete

# checkout files that have been changed.  
# I don't run this step.  Instead I just checkout everything, 
# then revert unchanged files before committing.
p4 diff -se ... | pr -x - edit

# Add new files, ignoring subversion info, EMACS backups, log files
# Filter output to see only added files and real errors
find . -type f \
 | grep -v -E '(\.svn)|(/build.*/)|(/\.settings)|~|#|(\.log)' \
 | p4 -x - add \
 | grep -v -E '(currently opened for add)|(existing file)|(already opened for edit)'

Eu adaptei este artigo da Base de Conhecimento Perforce .


Isso foi há sete anos, não estou surpreso. Estou surpreso que alguém ainda esteja usando o Perforce.
kevin cline de

... não por escolha: '(
DerMike

0

Estou procurando uma solução como .p4ignore também (e não vinculada a um IDE em particular). Até agora, a coisa mais próxima que encontrei é p4delta. Parece que fará exatamente o que o pôster original estava pedindo, embora por meio de outra camada de indireção.

http://p4delta.sourceforge.net

Infelizmente, embora isso pareça produzir a lista adequada de arquivos, não consigo fazer "p4delta --execute" funcionar ("Não é possível modificar uma string congelada") e o projeto não foi atualizado no ano. Talvez outros tenham mais sorte.


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.