Pergunta

Eu acho que eu já sei a resposta para isso, mas pensei que eu iria pedir de qualquer maneira:

Temos um arquivo que foi adicionado a um repositório Mercurial com informações confidenciais nele. Existe alguma maneira de remover esse arquivo junto com seu histórico de alterações sem remover toda a repo?

Foi útil?

Solução

Não, você não pode. Leia as mudanças que devem ter nunca foi seção do livro vermelho mercurial sobre isso; e particularmente o que sobre mudanças sensíveis que escapam subseção, que contém este parágrafo:

Mercurial também não fornece uma maneira para fazer um arquivo ou changeset completamente desaparecer da história, porque há há nenhuma maneira de impor a sua desaparecimento; alguém poderia facilmente modificar a sua cópia do Mercurial para ignorar tais directivas. Além do que, além do mais, mesmo se Mercurial desde que essa capacidade, alguém que simplesmente não tinha puxou um “tornar este arquivo desaparecer” changeset não seriam afetados por ela, nem crawlers Would visitante na hora errada, backups em disco, ou outro mecanismos. Na verdade, nenhum distribuídos sistema de controle de revisão pode tornar os dados confiavelmente desaparecer. fornecendo o ilusão de tal controlo poderia facilmente dar uma falsa sensação de segurança, e ser pior do que não fornecê-las em tudo.

A maneira usual de reverter as alterações comprometidos é suportado por mercurial através do comando backout (novamente, livro mercurial: lidar com mudanças comprometidos ), mas a informação não desaparece a partir do repositório: uma vez que você nunca sabe quem exatamente clonado seu repositório, que daria uma falsa sensação de segurança, conforme explicado acima.

Outras dicas

É verdade que você não pode facilmente remover um arquivo particular a partir Mercurial no sentido de que isso irá interromper todas as IDs changeset em seu repositório. Quando você alterar os IDs do changeset, todo mundo tem que re-clone do repositório. Veja a Wiki sobre a edição história para obter informações sobre as consequências de modificar a história no Mercurial.

Se isso é bom para você (repositório interno de uma empresa), então dê uma olhada na converter extensão . Ele pode fazer hg ? hg conversões e tem uma - filemap argumento que pode ser usado para excluir arquivos, entre outras coisas

É possível localmente, mas não globalmente, e isso muda o ID de cada commit após o ponto em que o arquivo foi adicionado. Para que a mudança de vara, você vai precisar de acesso a cada cópia única do repositório, em particular os que se puxado ou empurrado a partir.

Dito isto, tenho seguido seqüência Edição Histórico descrito no wiki do Mercurial para remover um arquivo de um dos meus repositórios. Esta seqüência assume que a revisão 1301: 5200a5a10d8b acrescentou o path/to/badfile.cfg arquivo, que não foi alterado em qualquer revisão posterior:

  1. Ativar a extensão MQ em sua .hgrc:

    [extensions]
    mq =
    
  2. Puxe as recentes mudanças de montante.

    hg pull
    
  3. Import tudo, desde a adição de arquivos em diante em MQ:

    hg qimport -r 1301:tip
    hg qpop -a
    
  4. Remova o arquivo do cometem que acrescentou ele.

    hg qpush 1301.diff
    hg forget path/to/badfile.cfg
    hg qrefresh
    
  5. Converter os patches para novas revisões Mercurial.

    hg qpush -a
    hg qfinish -a
    
  6. Empurre as novas revisões montante.

    hg push -f
    
  7. Sobre o montante repositório e todos os outros única cópia, retire as velhas revisões.

    hg strip 5200a5a10d8b
    

Aviso : Este passo pode destruir a obra, a menos que você tiver cuidado. Se alguém tiver cometido alguma coisa desde a última vez que você puxou do montante, então você vai ter que rebase que o trabalho antes de descascar. Infelizmente, a extensão rebase não é útil aqui; você vai ter que usar MQ novamente, convertendo os novos commits em manchas que você aplicar para o novo ponta.

Boa sorte.

Isso pode ser feito em menos de 10 min. em um único repositório, embora haja consequências.

Como: use hg convertido, como descrito no este excelente guia . Basicamente, você "Convert" um repo Hg em uma nova Hg repo, mas você começa a especificar uma lista de arquivos a serem excluídos durante a conversão. Este é um excerto das principais etapas:

Make sure all your teammates have pushed their local changes to the central repo (if any)
Backup your repository
Create a "map.txt" file:

# this filemap is used to exclude specific files
exclude "subdir/filename1.ext"
exclude "subdir/filename2.ext"
exclude "subdir2"

Run this command:
hg convert --filemap map.txt c:/oldrepo c:/newrepo
NOTE: You have to use "forward-slash" in paths, even on windows.
Wait and be patient
Now you have a new repo at c:\newrepo but without the files

Quanto às consequências ...

  • todos os IDs changeset depois que os arquivos que você deseja excluir foram adicionados será diferente
  • o novo repositório principal "limpa" terá que ser colocado manualmente no lugar do já existente
  • todos os membros da equipe terá que fazer novos clones do repo principal
  • quaisquer outros serviços que se integram com Hg pode exigir atenção (por exemplo, o controlador de assuntos, um sistema de revisão de código etc.)

transplante de hg, em seguida, tira hg

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