Por que o TFS não recebe as últimas?

177

Por que por que POR QUE os TFSs não conseguem o trabalho mais recente de forma consistente?

Você pensaria que esse recurso teria sido testado completamente.

O que tenho que fazer é obter uma versão específica e, em seguida, verificar a substituição de arquivos graváveis ​​e a substituição de todos os arquivos.

Minha configuração local está bagunçada ou você também faz isso?

Blankman
fonte
A coisa mais idiota que vejo é que "Obter versão mais recente" não faz nada, mesmo quando o arquivo local foi excluído por qualquer motivo. Eu teria pensado que verificar se o arquivo local pelo menos existe era uma coisa bastante óbvia a se fazer. Mas por que ele não pode apenas comparar o carimbo de data / hora de cada arquivo no servidor com o tempo em que você obteve um último (que poderia ser armazenado em algum local localmente) me deixa perplexo.
Dylan Nicholson
Isso deve ser um comentário.
Jimenemex

Respostas:

118

O TFS redefiniu o que "Get Latest" faz. Nos termos do TFS, Obter Mais Recente significa obter a versão mais recente dos arquivos, mas ignore os que o servidor acha que já estão em sua área de trabalho. O que para mim e para quase todo mundo no planeta está errado.

Consulte este link: http://blogs.microsoft.co.il/blogs/srlteam/archive/2009/04/13/how-get-latest-version-really-works.aspx

A única maneira de fazer o que você quer é obter a versão específica e marque as duas caixas "Substituir ...".

Eu não
fonte
7
Isso não está correto. O TFS "get latest" funciona exatamente como anunciado, desde que o TFS conheça as alterações nos arquivos. O Get Latest apenas "estraga tudo" quando as pessoas saem e modificam o arquivamento fora do IDE sem fazer o check-out primeiro. Então, o TFS acha que você tem a fonte mais recente no disco e não a obtém.
Robaticus
18
@Robaticus Como os tfs 'são atualizados' realmente anunciados. Assim como chris animado disse antes, ele e todos no planeta entendem que "obter as últimas" obtém a versão mais recente, que não é o que a tfs faria. você não precisa editar a fonte fora do tfs para estragar tudo. Eu tenho 2 estações de trabalho e trabalhando de forma intercambiável e eu simplesmente não consigo obter a sincronização de origem. obter a versão mais recente já é um incômodo com o tfs e não consigo imaginar o que a fusão gostaria.
Syaiful Nizam Yahya
2
@publicENEMY, eu costumava trabalhar com tfs em duas máquinas e, de fato, é um problema para sincronizar a fonte. Você pode precisar de dois usuários TFS para isso ...
kroiz
11
Ugh! Isso é uma dor. O Visual Studio pode ser facilmente confuso e, às vezes, corrigi-lo no sistema de arquivos é o caminho mais fácil. Outros sistemas de controle de origem, como o Subversion, têm ganchos do Windows Explorer e isso e a integração do VS fazem um trabalho melhor de monitoramento de alterações. Sinto falta do SVN!
Dan Csharpster
3
Eu concordo com o autor. Eu li "Obter a versão mais recente" como "Obter a versão mais recente do servidor" (de onde mais eu poderia obtê-la?). No VS2010, obtive a versão mais recente e disse que tenho a versão mais recente, mas se fizer uma comparação, ela lista as diferenças entre a edição local e a mais recente do servidor. Eu estou bem com isso, não substituindo o trabalho local, mas deve pelo menos fazer uma comparação de carimbo de data e hora e não me enganar com "Você tem a versão mais recente". Quando excluí a versão local, a Get Get Version mais recente funcionou conforme o esperado.
#
42

Às vezes Get specific version , marcar as duas caixas de seleção não gera o arquivo mais recente. Você provavelmente fez uma alteração em um arquivo e deseja desfazer essas alterações ao obter novamente a versão mais recente. Bem ... Undo pending changesé para isso e não é o objetivo Get specific version.

Se em dúvida:

  • desfazer check-in pendente no (s) arquivo (s)
  • faça uma comparação posteriormente para garantir que seu arquivo corresponda à versão esperada
  • execute uma 'comparação' recursiva em todo o seu projeto depois para ver o que mais há de diferente
  • fique de olho na janela de alterações pendentes e, às vezes, talvez seja necessário marcar a opção 'levar versão do servidor' para resolver uma alteração pendente incompatível

E este é o meu favorito que eu acabei de descobrir:

  • fique de olho na Outputjanela para mensagens como esta:

    Aviso - Não é possível atualizar R: \ TFS-PROJECTS \ www.example.com \ ExampleMVC \ Example MVC \ Example MVC.csproj porque você tem uma edição pendente.

Esta mensagem crítica aparece na janela de saída. Nenhuma outra notificação! Nada nas alterações pendentes e nenhuma outra mensagem de diálogo informando que o arquivo que você solicitou explicitamente não foi recuperado! E sim - você resolve isso executando Undo pending changese obtendo o arquivo.

Simon_Weaver
fonte
Obrigado, sua resposta ( Undo pending changes) funcionou para mim.
RAM
Apenas certifique-se de desfazer apenas as mudanças no arquivo que você realmente deseja substituir e não tudo o que você está trabalhando
Simon_Weaver
@ Simon_Weaver Graças a isso resolvi meu problema, faz sentido o motivo pelo qual ainda está acontecendo, é super irritante.
Nulltron 22/05
12

O TFS, como alguns outros provedores de controle de origem, como o Perforce, faz isso, pois o sistema sabe qual foi a última versão que você obteve com êxito, portanto, faça as alterações mais recentes em "obter alterações desde x". Se você seguir as regras e realmente verificar as coisas antes de editá-las, não confunda as coisas e "receba as últimas" realmente faz o que diz.

Como você viu, você pode forçá-lo a reavaliar tudo, que tem um uso de largura de banda muito maior, mas se comporta mais perto de como o SourceSafe costumava.

Rowland Shaw
fonte
11

É difícil responder a uma declaração sem exemplos de como não está funcionando, mas é crucial entender que o TFVC (no modo "Área de Trabalho do Servidor", que era o mecanismo anterior ao TFS 2012) não examina o estado do seu sistema de arquivos local . Os Espaços de Trabalho do Servidor TFVC são um tipo de sistema "checkout-edit-checkin", onde isso é planejado por projeto, uma decisão intencional tomada para reduzir massivamente a quantidade de E / S de arquivo necessária para determinar o estado do seu espaço de trabalho. Em vez disso, as informações da área de trabalho são salvas no servidor.

Isso permite que Workspaces TFVC Server para escala para muito grandes bases de código de forma muito eficiente. Se você estiver em uma base de código de vários gigabytes (como o Visual Studio ou a árvore de origem do Windows), seu cliente não precisará verificar o sistema de arquivos local, procurando arquivos que possam ter sido alterados, porque o contrato que você possui com o TFS é que você fará o check-out explícito de um arquivo quando você quiser editá-lo.

Espera-se que você não marque um arquivo como somente gravação e altere-o sem primeiro fazer check-out explicitamente. Se você seguir esse caminho, o servidor não saberá que você fez alterações no seu arquivo e a execução de uma operação "Get Latest" não atualizará o espaço de trabalho local, porque você não informou ao servidor que fez alterar.

Se você fazer subverter este mecanismo, então você pode usar o tfpt reconcilecomando para examinar o seu espaço de trabalho local para as mudanças que você fez localmente.

Se você estiver usando a versão "Obter versão específica" e selecionando as opções "forçar" e "substituir", é muito provável que você tenha o hábito de ignorar todos os reforços que o TFS implementou para impedir que você se machuque, e você provavelmente deve considerar os Espaços de trabalho locais do TFVC.

Os Espaços de trabalho locais do TFVC fornecem um tipo de sistema de controle de versão "editar, mesclar e confirmar", o que significa que você não precisa fazer check-out explicitamente dos arquivos antes de editá-los e eles não são somente leitura em disco. Em vez disso, basta editar o arquivo e seu cliente verificará o sistema de arquivos, notará a alteração e a apresentará como uma alteração pendente.

Os Espaços de trabalho locais do TFVC são recomendados para pequenos projetos que não exigem controle de permissões refinadas, pois apresentam um fluxo de trabalho muito melhor. Você não precisa estar online e não precisa fazer check-out explicitamente dos arquivos antes de editá-los.

Os Espaços de Trabalho Locais TFVC são o padrão no TFS 2012 e, se não estiverem ativados para você, pergunte ao administrador do servidor. (Organizações com bases de código muito grandes ou requisitos rigorosos de auditoria podem desativar os Espaços de Trabalho Locais do TFVC.)

O excelente livro de Eric Sink, Version Control By Example, descreve as diferenças entre os sistemas checkout-edit-checkin e edit-merge-commit e quando um é mais apropriado que o outro.

O manual do Professional Team Foundation Server 2013 também fornece informações excelentes sobre as diferenças entre os Espaços de trabalho do servidor TFVC e os Espaços de trabalho locais do TFVC. A documentação e os blogs do MSDN também fornecem informações detalhadas:

Edward Thomson
fonte
Resposta ótima e informativa, mas não tenho certeza de que "marcar um arquivo como somente gravação" responda ao OP. Sei que estou usando o Visual Studio (agora 2013) para fazer todas as minhas alterações nos arquivos * .cs em um projeto MVC .NET e, quando ligo meu laptop, o "Get Latest" geralmente me deixa pendurado no ponto em que estou quase fazendo cultos de carga "Advanced >>> Get Specific >>> Latest >>> Overwrite" now. Não há edição ou check-in fora do VS. O VS localiza os arquivos que eu editei e os coloca em Alterações pendentes corretamente. Verifico-os com o VS. Não vejo nada que possa estar "me machucando", mas as últimas atualizações não funcionam de maneira confiável. ??
Ruffin
@ ruffin Você está dizendo que as últimas trava ? Não foi assim que interpretei a pergunta do OP. Isso já termina? Outras operações são lentas ou apenas um Get? O Get w / Overwrite é sempre lento ou apenas o habitual Get Latest?
Edward Thomson
Não, não trava. Posso obter o mais recente, e parece funcionar (e funciona razoavelmente rapidamente), mas os arquivos não são alterados. Se eu obtiver substituição específica >>> Mais recente >>>, assim como as sugestões do @NotMe , os arquivos serão atualizados. Provável arenque vermelho: também acontece ocasionalmente com prateleiras. Sim, meus caminhos de trabalho estão corretos ou o Get Specific não funcionaria, eu não acredito.
Ruffin
Eu não tenho uma boa sugestão aqui. Desejo que você entre em contato com o suporte se tiver um problema antigo que acredita ser um bug. Se isso é um bug ou não, você deve obter uma solução para esse problema.
Edward Thomson
6

O Team Foundation Server (TFS) controla sua cópia local em um diretório oculto chamado $ TF. Quando você emite a "versão mais recente", o TFS examina essa pasta e vê se o tempo está com a cópia mais recente. Se isso acontecer, não fará o download da cópia mais recente. Não importa se você possui o arquivo original ou não. Na verdade, você pode ter excluído a pasta inteira (como no meu caso) e o TFS não buscará a cópia mais recente, porque não analisa o arquivo real, mas o diretório oculto onde ele registra as alterações. A falha nesse design é que qualquer coisa feita fora do sistema não será gravada no TFS. Por exemplo, você pode acessar o Windows Explorer, excluir uma pasta ou arquivo e o TFS não o reconhecerá. Será totalmente cego. Pelo menos eu espero que o Windows não permita que você exclua esse arquivo, mas sim!

Uma maneira de impor a cópia mais recente é excluir a pasta oculta $ TF manualmente. Para fazer isso, vá para o prompt de comando e navegue até a pasta raiz onde seu projeto foi retirado e emita este comando

rd/s $tf                    // remove $TF folder and everything inside it

Se você quiser apenas verificar a pasta oculta, poderá fazê-lo usando

dir /ah                    // display hidden files and folders

Nota: Se você fizer isso, o tf pensará que você não possui nenhuma cópia local, mesmo que você a possua em arquivos e sincronizará tudo novamente.

Cuidado: Use este método por sua conta e risco. Por favor, não o use em trabalhos críticos.

Hammad Khan
fonte
Isso funcionou para mim quando nada mais funcionou. Tentei obter uma versão específica e marquei as duas caixas de seleção para forçar o download, mas isso não conseguiu os arquivos. Eu acho que algo estava corrompido. Mas essa solução funcionou.
Francisco d'Anconia 02/03
3

"Obter versão mais recente" por padrão só fará o download dos arquivos que foram alterados no servidor desde a última vez em que você executou "Obter versão mais recente". O TFS mantém o controle dos arquivos baixados para que não gaste tempo baixando a mesma versão dos arquivos novamente. Se você estiver modificando os arquivos fora do Visual Studio, isso poderá causar problemas de consistência, como parece que você está vendo.

David
fonte
3

Infelizmente, deve haver um ou mais erros no TFS 2008, pois esse problema surge regularmente em máquinas de desenvolvedores e constrói servidores nos quais eu também trabalho.

Posso fazer o Get Latest, posso ver na lista do histórico do projeto que houve confirmações após a última vez que obtive o Get Latest, não toquei nos arquivos do disco de forma alguma, mas após a função "Get Latest" concluído, quando verifico a guia TFS, alguns dos arquivos ainda informam que não são a versão mais recente.

Obviamente, o TFS pode determinar que eu tenho arquivos antigos localmente, pois a lista diz isso. No entanto, o Get Latest não consegue fazer isso, obtenha a versão mais recente. Se eu fizer o que você fez, use a versão Get Specific e marque as duas caixas de seleção na parte inferior da caixa de diálogo, para que os arquivos sejam recuperados.

Alteramos nossos servidores de compilação para sempre usar o tipo de função da versão Get Specific, portanto, esta parte agora funciona, mas como nosso servidor de compilação (TeamCity) também depende de verificar se houve alterações nos arquivos para iniciar uma compilação , às vezes passa para o modo "nada mudou, nada para ver aqui, siga em frente" e não faz nada até executarmos forçosamente a configuração da compilação.

Observe que experimentei esse problema em uma máquina que nunca foi tocada, exceto para obter as versões mais recentes +, ambas manualmente, para que não haja nada de adulteração nos arquivos. É apenas TFS ficando confuso.

Uma vez que isso ocorreu, verifiquei que os arquivos no disco eram realmente binários idênticos à versão recuperada anteriormente, portanto, nenhuma violação manual foi feita com os arquivos.

Além disso, não consigo ver como o TFS pode "saber" se os arquivos foram alterados no disco ou não, sem realmente examinar o conteúdo. Se uma parte do TFS perceber que os arquivos realmente não são a versão mais recente, a versão Get Latest deverá conseguir absolutamente a versão mais recente. Isso em referência aos comentários para outras respostas aqui.

Lasse V. Karlsen
fonte
O TFS depende do número da versão do arquivo para saber se você possui a versão "mais recente" ou não. Esse número é mantido inteiramente no TFS e é atualizado apenas quando alguém faz o check-in. Portanto, quando você "Recebe as últimas", o TFS verifica seu banco de dados para ver qual foi a última versão enviada para você. Se esse número for igual à versão atual, ele acredita que você possui a versão mais recente; independentemente do que realmente está no seu sistema de arquivos local. A idéia era limitar o tráfego de rede. Infelizmente, a única maneira de esse modelo funcionar é se todas as edições ocorrerem em um aplicativo que tenha conhecimento do TFS.
NotMe
Além disso, concordo que há pelo menos um bug na versão 2005/08 disso. Vi os problemas exatos que você descreveu em várias máquinas; que é o que me levou a usar a versão Get Specific religiosamente.
NotMe
Em alguns casos, as edições ocorreram inteiramente no Visual Studio em uma máquina, a outra máquina, cujo único objetivo é obter a compilação mais recente +, nenhuma alteração local está sendo feita. No entanto, ele consegue estragar tudo. Não estou impressionado com o Controle de origem TFS para dizer o mínimo. Esperamos que 2010 tenha menos desses problemas.
Lasse V. Karlsen
3

Pode ser porque você está efetuando login no TFS como o mesmo usuário e o nome da área de trabalho (com base no nome da máquina por padrão) também é o mesmo; portanto, o TFS acha que você está na mesma máquina e na mesma área de trabalho; portanto, você já tem a versão mais recente do os arquivos, para que não os obtenha para você.

tente renomear sua máquina e crie um novo espaço de trabalho como uma nova máquina.

WalkingCat
fonte
2

Eu tive o mesmo problema com o Visual Studio 2012. Não importa o que eu fiz, ele não recebeu o código do controle de origem TFS.

No meu caso, a causa foi o mapeamento de uma pasta + subpasta do controle de origem separadamente, mas para a mesma árvore no meu HD local.

A solução foi remover o mapeamento da subpasta usando a janela "gerenciar áreas de trabalho".

Nir
fonte
1

A maioria dos problemas que eu vi com os desenvolvedores reclamando que o Get Latest não faz o que eles esperam decorre do fato de que eles estão executando o Get Latest no Solution Explorer e não no Source Control Explorer. O Solution Explorer obtém apenas os arquivos que fazem parte da solução e ignora qualquer coisa que possa ser exigida pelos arquivos na solução e, portanto, parte do controle de origem, enquanto o Source Control Explorer compara seu espaço de trabalho local com o repositório no servidor para determinar quais arquivos são precisos.

levelnis
fonte
Eu tentei no Team Explorer, ainda o mesmo resultado. No meu caso, apaguei a pasta e queria obter a cópia mais recente novamente, mas sem sorte.
precisa
1
Eu não concordo com esta resposta. Se você tiver compartilhado projetos usados por soluções diferentes, você tem que fazê-lo no Solution Explorer, caso contrário ele irá apenas fazer um Get nesse caminho TFS especial
Heliac
Por que adicionar a opção do Solution Explorer se você não deveria usá-la? Quando cliquei em "Mostrar todos os arquivos", o arquivo estava lá, mas não foi incluído no meu projeto. Estranho, porque nem eu o adicionei.
mokumaxCraig
1

Quando me deparei com esse problema, não obtendo as últimas e as incompatibilidades de versão, primeiro faço uma "Obter versão específica", defina-a como changeset e insira 1. Isso removerá todos os arquivos do espaço de trabalho local (para esse projeto, pasta, arquivo etc) e também terá a atualização do TFS, para que você saiba que agora não há nenhuma versão baixada. Você pode fazer um "Get Latest" e viola, na verdade você terá as últimas

mjlarezzo
fonte
1

Isso pode acontecer quando você usa o TFS de duas máquinas diferentes com a mesma conta. Nesse caso, você deve comparar para ver os arquivos alterados e verificá-los, obter as últimas e desfazer alterações pendentes para remover a verificação

Mohamed Badr
fonte
1

Isso funcionou para mim:
1. Saia do Visual Studio
2. Abra uma janela de comando e navegue até a pasta: "% localappdata% \ Local \ Microsoft \ Team Foundation \"
3. Navegue até as subpastas de todas as versões e exclua a subpasta "cache" e seu conteúdo
4. Reinicie o Visual Studio e conecte-se ao TFS.
5. Teste a versão mais recente.

Ludwo
fonte
0

só quero adicionar o TFS O MSBuild não suporta caracteres especiais em pastas, como "@"

eu tinha experimentado no passado onde uma de nossas pastas de projeto chamada External @ Project1

criamos uma definição de compilação do TFS para executar um arquivo msbuild personalizado; a pasta da área de trabalho não está recebendo nenhum conteúdo da pasta External @ Project1 durante a atualização da área de trabalho. Parece que o tfs get está falhando, mas não mostra nenhum erro.

após algumas tentativas e erros e renomear a pasta para _Project1. voila, temos arquivos na pasta (_Project1).

bherto39
fonte
TFS ou não, você nunca deve usar caracteres especiais nos nomes das pastas do projeto!
Heliac
@ não é especial. E nem%, etc, etc. É apenas a preguiça por parte da Microsoft que faz com que esses caracteres sejam tratados de maneira diferente dos caracteres 'normais'.
Kevin Whitefoot
0

Ferramenta: Ferramentas elétricas TFS

Fonte: http://dennymichael.net/2013/03/19/tfs-scorch/

Comando: tfpt scorch / recursive / exclui C: \ LocationOfWorkspaceOrFolder

Isso exibirá uma caixa de diálogo solicitando que você exclua ou faça o download de uma lista de arquivos. Marque ou desmarque os arquivos de acordo e pressione ok. Aparência na grade (CheckBox, FileName, FileAction, FilePath)

Causa: o TFS será comparado somente aos itens na área de trabalho. Se alterações foram feitas fora do espaço de trabalho, o TFS não as notará.

Espero que alguém ache isso útil. Encontrei esta postagem depois de excluir um punhado de pastas em vários locais. Não lembrar as pastas que excluí excluía a opção usual Forçar / Substituir que eu teria usado.

usuario
fonte
0

No meu caso, obter versão específica, mesmo marcando as duas caixas de seleção e desfazendo todas as alterações pendentes, não funcionou.

Verificou os espaços de trabalho. Edite o espaço de trabalho atual. Verifique todos os caminhos. O caminho da solução estava incorreto e estava apontando para uma pasta excluída.

Corrigido o caminho e obter as atualizações mais recentes.

Himanshu Patel
fonte
0

Clique com o botão direito do mouse em: Avançado> Obter versão específica . Selecione "Versão Letest" e agora, importante, marque duas verificações: insira a descrição da imagem aqui

As verificações são:
Substituir arquivos graváveis ​​que não estão marcados

Substitua todos os arquivos, mesmo que a versão local corresponda à versão especificada

Javier FF
fonte
Descreva os itens que precisam ser verificados em vez de postar uma captura de tela.
Chuck Adams