TFS: Como você pode desfazer o checkout de arquivos não modificados em um arquivo em lotes


172

Usamos um arquivo em lotes para gerar código e ele faz o check-out automático dos arquivos gerados do Team Foundation Server (TFS) para que possa regenerá-los. A maioria desses arquivos não é modificada, mas o gerador não sabe disso com antecedência.

O comando "tfs undo" desfaz o checkout, mas avisa se alguns foram modificados (o que não queremos fazer). Também não queremos fazer o check-in dos arquivos gerados imediatamente.

Existe um comando (ou série de comandos) para desfazer a verificação geral de todos os arquivos não modificados sem avisar o usuário?


Observe que desfazer manualmente todas as alterações com a expectativa de escolher "Não a todos" quando solicitado sobre arquivos que foram alterados não funcionará corretamente, pois desfaz as ADDalterações sem aviso prévio (consulte a resposta de Ray ).
Elaskanator

Respostas:


202

Dê uma olhada no comando Desfazer inalterado do Team Foundation Server Power Tools agosto de 2011

c:\myProject> tfpt uu . /noget /recursive

Obrigado Matt Florence pela atualização do link.

Obrigado Ray Vega pela sintaxe real .


1
Isso deve ser editado / mesclado para conter as informações de uso como parte do conteúdo da resposta.
mcw


17
hmm, somehing que quase todo mundo faz várias vezes por dia: "Vamos colocá-lo em um instalador separado chamado Power Tools" ... suspiro
vidstige

1
@ Mike Chaliy você pensaria. Estou testando o TFS agora e estava pesquisando como fazer isso e acabei aqui.
vidstige

3
Não funciona se suas alterações forem mescladas. Parece que o tfpt uu sempre considera uma mesclagem uma mudança real, mesmo que não haja alteração no arquivo e não há opção para inverter esse comportamento. Está ok como comportamento padrão, mas às vezes não é o que você deseja.
user1164178

124

Instale o Team Foundation Server Power Tools e execute o seguinte na linha de comando usando tfpt.exe na raiz do diretório do espaço de trabalho do seu projeto:

c:\myProject> tfpt uu . /noget /recursive

A inclusão /nogeté altamente recomendada, pois evita a obtenção forçada de todos os arquivos do seu projeto, o que, dependendo do número total, pode levar um tempo extremamente longo.


12
Essa deve ser a resposta aceita, pois possui todos os detalhes relevantes (conforme comprovado pela pontuação mais alta).
Rikoe 01/07

7
Legal. Além disso, por que não adicionar isso como uma 'Ferramenta Externa' permanente ao Visual Studio. Tomando isso como um exemplo: blog.kurtschindler.net/post/… Comando: [seu diretório de instalação] \ TFPT.EXE Argumentos: uu. / noget / recursive Diretório inicial: $ (SolutionDir)
rohancragg

12
A pergunta especifica fazer essa operação sem o prompt , mas nenhuma das respostas parece abordar isso. Se você precisar disso, o / noprompt adicional é a opção que você está procurando. A documentação do PowerTools está ausente! Ele lista essa opção para alguns dos comandos, mas não este (UU). Cuidado!
Johnny Kauffman

1
@ user20358 quer cdpara onde seu diretório de espaço de trabalho é (por exemplo, o meu era c:\myProject) ou incluí-lo explicitamente depois uu(substituindo o período .com ele)
Ray

Isso possui uma chave de força, como / Y ou / force? Sempre me perguntam se realmente deseja desfazê-lo e gostaria de ter isso automatizado. Coloque / Y lá, mas ele me diz que a opção Y requer um valor.
Squirrelkiller

118

Obrigado @mike & @ray,

Eu desejo facilitar.

No VS, no menu Ferramentas, clique em "Ferramentas externas".

Ferramentas externas

Clique em Adicionar.

Digite o título.

Comando: tfpt.exe

Argumentos: uu. / noget / recursive

Diretório inicial: [você pode escolher no botão de seta].

Desfazer inalterado na solução

Desfazer inalterado no projeto

Dois novos comandos são adicionados ao menu Ferramentas.

Use-os quando necessário.

Aproveitar,

Ofir


3
Muito legal. Você também pode dar um passo adiante e adicionar um atalho. Observe a que distância está o seu comando adicionado (por exemplo, pode ser o quarto). Em seguida, vá para Ferramentas -> Opções -> Ambiente -> Teclado -> e digite a caixa de texto "Mostrar comandos que contêm" "Ferramentas.Externo" e atribua um atalho. Por exemplo, eu selecionei Tools.ExternalCommand4, pois meu comando de desfazer recém-adicionado foi o quarto desativado. Em seguida, atribuí as teclas de atalho Ctrl + Alt + U, Ctrl + Alt + U
Mario

1
Poderíamos, por favor, ter uma versão atualizada disso? Se encontrado tf.exe, mas o que é o comando uu? diz-me comando não reconhecido: uu. Obrigado pela ajuda
Shay

1
@ Shay: funciona para mim no VS2015 com as mais recentes ferramentas de poder do TFS instaladas.
Igor Malin

27
  1. Clique com o botão direito do mouse no seu projeto
  2. Selecione desfazer a finalização da compra e clique em OK ou qualquer confirmação restante ...
  3. Em seguida, ao desfazer o checkout, para cada arquivo que contém REAL alterações, um prompt solicitará que você confirme o check-out desse arquivo ... basta clicar em "Não para todos"

O Visual Studio saberá se o arquivo com check-out possui alterações ou nenhuma.

AVISO: Este método também remove novos arquivos, ou seja, arquivos que ainda não foram registrados no TFS. Se você deseja manter esses arquivos, basta excluí-los do conjunto de arquivos que você "desfaz".


14
Be aware that this method also removes added files that are not yet checked in from TFS.... Sim, isso é um desqualificador bastante imediato.
precisa saber é o seguinte

1
Funciona para os meus galhos Baseless . Obrigado. Normalmente, neste caso, o VS marcou Todos os arquivos na solução como alterados.
KoViMa 23/09/16

2
é um inferno quando nuget faz checkout de 10000 arquivos que não precisam ser atualizados.
Ievgen Naida 16/03/19

13

Atualizou esta pergunta com uma resposta ao trabalhar apenas com TFS2017 e VS2017 / VS2019 .

As ferramentas de poder não existem para o TFS 2017 e as antigas não podem funcionar bem com ele, mas aparentemente a maior parte da funcionalidade foi movida para o próprio VS2017 ou plugins (veja abaixo).

Extensão Visual Studio 2017/2019

Algumas ações, como desfazer arquivos inalterados, foram movidas para um

extensão para VS2017

extensão para VS2019

Localização do botão "Desfazer inalterado":

desfazer a localização inalterada do botão

Bug conhecido

Você deve abrir o 'Source Control Explorer' (e deixá-lo aberto) para que 'Undo Unchanged' seja exibido no menu Action da exibição Pending Changes. relatado aqui .

Extensão de Integração de Shell do Windows

Além disso, você ainda pode configurar a integração de shell do Windows através de um instalador separado, que não está mais vinculado ao TFS Power Tools.

A integração do shell do Windows não funciona exatamente da mesma maneira que as ferramentas elétricas anteriores, mas as ações mais importantes funcionaram para mim.


Notei na pergunta, que querem escrevê-lo, para que eu não tenho uma solução, eu tenho medo
Schwarzie2478

1
Não consigo encontrar a opção "Desfazer inalterado" no VS2017 depois de instalar a extensão vinculada. Perdi alguma coisa ?
Erzékiel 7/02/19

Eu não usei muito isso. Quando o usei para testá-lo para meu cliente, tive que clicar um pouco no Team Explorer e garantir que houvesse alterações a serem desfeitas. É possível que apenas apareça quando você tiver apenas alterações pendentes na fila para uma confirmação que essa opção apareça. (Ou um ramo muda apenas) ...
Schwarzie2478

2
@ Erzékiel A opção aparece apenas quando o Solution Explorer está aberto e pronto.
MatrixRonny

1
Essa extensão funciona algumas vezes e sua presença está ligada ao ter o TFS Source Control Explorer aberto e não ao Solution Explorer (como alguns apontaram incorretamente) - não misture as duas janelas de controle diferentes. Contudo; quando digo algumas vezes, é porque vem e vai. Agora eu não tenho, eu fiz um mês atrás. É um pouco buggy e eu temo que outras extensões sejam as culpadas, como o Resharper e similares.
Christian

8

Se você simplesmente fizer o check-in de todos os arquivos novamente que efetuou o check-out, o TFS será inteligente o suficiente para descobrir quais são alteradas e incluí-las apenas no conjunto de alterações registrado no servidor.

O TFS faz isso comparando os hashes MD5 do conteúdo dos arquivos antes e depois do check-in.

Isso tudo pressupõe que seu processo de geração esteja atualizando puramente o mesmo conjunto de arquivos, ou seja, você nunca terá um caso em que um arquivo gerado em uma geração anterior não seja necessário na próxima geração (ou seja, você desejará interromper uma exclusão para esse arquivo) ou que os arquivos mudem de nome.

Se o seu processo precisar potencialmente de exclusão de arquivos, a melhor opção é procurar o comando Team Foundation Power Tools ( tfpt ) e usar o comando tfpt online que verificará apenas os arquivos que foram alterados e será inteligente o suficiente para pend exclui todos os arquivos que não são mais necessários ou que mudam de nome e adiciona pend.

Boa sorte,

Martin.


6
Obrigado por isso, no entanto, não queremos fazer o check-in dos arquivos modificados naquele momento. Os modificados não devem ser verificados até que o recurso seja concluído, mas os não modificados devem ser removidos para que o desenvolvedor possa revisar as alterações.
Robert Wagner

@RobertWagner Se você tem uma compilação fechada, pode cancelar (se não interromper a detecção de arquivos idênticos) quando receber o alerta pop-up de que as alterações devem ser criadas primeiro.
Elaskanator

6

Cuidado para desfazer o TFS não reverterá o valor "Data da modificação" do sistema de arquivos. Isso é muito frustrante, especialmente se você usar ferramentas como robocopy para sincronizar máquinas remotas. Mesmo depois de você desfazer o check-out, se você salvou o arquivo e atualizou o valor "Data da modificação", esse valor atualizado permanecerá mesmo após o check-out.


1
Use robocopy ou um VCS, usar uma mistura sempre dará inconsistências. Muito melhor seria preencher cada máquina diretamente do VCS.
Richard

4

Existem alguns pontos sobre a opção uu para tfpt (recomendados na maioria das outras respostas) que não estavam claros para mim no começo. Primeiramente, esta é a ajuda da linha de comando que pode ser acessada com o comandotfpt uu /?

Desfaz alterações pendentes redundantes. Se o estado de um item com uma alteração pendente for o mesmo que no servidor, a alteração será desfeita.

Uso: tfpt uu [/ changeset: changesetnum] [/ recursive] [/ noget] [filespec ...]

  • / changeset Compare o espaço de trabalho aos estados do item na versão do changeset especificada em vez da versão mais recente
  • filespec ... Verifique apenas as especificações listadas para alterações redundantes
  • / recursive Verifique as especificações de arquivo especificadas com recursão completa
  • / noget Não execute get antes de verificar

A opção / changeset não pode ser usada com filespecs ou / recursive.

Agora, deixe-me quebrar o comando recomendado nas outras respostas.

tfpt uu . /noget /recursive
  • tfpt uu especifica que desejamos usar o comando 'Desfazer inalterado'.
  • . indica (eu acho) que o diretório de trabalho atual deve ser usado como o filespec.
  • /noget garante que 'get latest version' não seja chamado antes de desfazer os arquivos inalterados.
  • /recursivegarante que não apenas o tipo de arquivo seja considerado, mas todas as pastas e arquivos filho recursivos. Isso parece depender do tipo de arquivo - se não houver nenhum fornecido, todo o espaço de trabalho será processado.

Portanto, há algumas coisas a serem observadas aqui em relação ao comando de cima ...

  • Depende do diretório de trabalho.
  • Não processa todo o espaço de trabalho.

Eu descobri que o comando a seguir funciona melhor para mim - ele processará todo o espaço de trabalho.

tfpt uu /noget

Observe que ele ainda depende do diretório ativo em que o tfpt o utiliza para determinar qual espaço de trabalho deve ser processado. Mas desde que você forneça um caminho para um arquivo ou pasta dentro da área de trabalho, você estará pronto.


3

Eu posso ver a abordagem de Ray LionFang acima. Não posso comentar lá, pois não tenho o representante. Embora eu goste dessa abordagem, pois não há alterações necessárias nas Ferramentas, etc ........

  1. Clique com o botão direito do mouse no seu projeto
  2. selecione desfazer a finalização da compra e clique em OK ou qualquer confirmação restante ...
  3. então, ao desfazer a finalização da compra, para cada arquivo que contém REAL alterações, um prompt solicitará que você confirme a finalização da compra desse arquivo ... basta clicar em "Não para todos"
  4. O Visual Studio saberá se o arquivo com check-out possui alterações ou nenhuma. Esteja ciente de que esse método também remove os arquivos adicionados que ainda não foram registrados no TFS ...

....... existe um problema com essa abordagem, ao pressionar "Não a todos" retém alguns arquivos que não são modificados. Parece fazer algo como Desfazendo arquivos não modificados até atingir o primeiro arquivo realmente modificado e depois ignora o restante dos arquivos não modificados, se isso fizer algum sentido. Só vi esse efeito de vez em quando.

Uma possível solução alternativa é seguir o processo acima, mas em vez de pressionar "Não para todos", pressione "Não" para cada arquivo. Como isso pode demorar um pouco, dependendo do número de arquivos com os quais você está trabalhando, o que eu normalmente faço é manter pressionado "ALT + N", e ele apenas acelera todos os arquivos enquanto desfaz TODOS os arquivos não modificados.


esteja ciente de que isso não pode ser enfatizado o suficiente. Os arquivos adicionados recentemente ao projeto também são removidos com essa abordagem. Isso é mencionado no servidor das outras respostas também.
Christian

-20

Até onde eu entendi, no TFS, se você faz o check-out de um projeto de equipe, o projeto inteiro é retirado e você não tem controle de quais arquivos serão desativados. Se você deseja impedir o check-in em determinados arquivos, pode bloqueá-los.

No trabalho, todos nós odiamos o TFS.


1
Podemos verificar os arquivos individuais, e bloqueio não permitiria o desenvolvedor para verificá-los no.
Robert Wagner

5
Iria votar, mas "No trabalho, todos odiamos o TFS". salvou.
James
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.