Perché TFS non ottiene l'ultimo ottiene l'ultimo?


177

Perché Perché PERCHÉ TFS non ottiene costantemente il lavoro più recente?

Avresti pensato che quella funzionalità sarebbe stata testata a fondo.

Quello che devo fare è, ottenere una versione specifica, quindi controllare sia sovrascrivere i file scrivibili + sovrascrivere tutti i file.

La mia configurazione locale è incasinata o lo fai anche tu?


La cosa più sciocca che vedo è che "Ottieni ultima versione" non fa nulla anche quando il file locale è stato eliminato per qualsiasi motivo. Avrei pensato di verificare che almeno il file locale fosse una cosa abbastanza ovvia da fare. Ma il motivo per cui non può semplicemente confrontare il timestamp di ciascun file sul server con l'ora in cui hai fatto l'ultima volta (che potrebbe essere memorizzato da qualche parte a livello locale) mi sconcerta.
Dylan Nicholson,

Questo dovrebbe essere un commento.
Jimenemex,

Risposte:


118

TFS ha ridefinito ciò che fa "Get Latest". In termini TFS, Get Latest significa ottenere la versione più recente dei file, ma ignora quelli che il server ritiene siano già nell'area di lavoro. Quale per me e quasi tutti gli altri sul pianeta è sbagliato.

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

L'unico modo per farlo fare quello che vuoi è ottenere la versione specifica, quindi selezionare entrambe le caselle "Sovrascrivi ...".


7
Questo non è corretto TFS "get latest" funziona esattamente come pubblicizzato, purché TFS sia a conoscenza delle modifiche ai file. Ottieni Ultimi "rovina" solo quando le persone escono e modificano archiviate al di fuori dell'IDE senza prima verificarle. Quindi, TFS pensa di avere l'ultima fonte sul disco e non la ottiene.
Robaticus,

18
@Robaticus In che modo i tfs 'ottengono le ultime notizie' pubblicizzati davvero. proprio come ha detto chris vivace prima, lui e tutti sul pianeta capiscono che 'get latest' ottiene l'ultima versione che non è ciò che farebbe tfs. non è necessario modificare l'origine al di fuori di tfs per rovinarlo. ho 2 workstation e lavoro in modo intercambiabile e non riesco proprio a ottenere la sincronizzazione della sorgente. ottenere l'ultima versione è già una seccatura con tfs e non riesco a immaginare cosa vorrebbe la fusione.
Syaiful Nizam Yahya,

2
@publicENEMY, lavoravo con tfs su due macchine e in effetti è un problema sincronizzare la sorgente. Potrebbero essere necessari due utenti tfs per questo ...
kroiz

11
Ugh! Questo è un dolore Visual Studio può facilmente incasinarsi e talvolta risolverlo sul filesystem è il modo più semplice di procedere. Altri sistemi di controllo del codice sorgente come Subversion hanno hook di Windows Explorer e sia quello che l'integrazione VS fanno un lavoro migliore nel monitoraggio delle modifiche. Mi manca SVN!
Dan Csharpster,

3
Sono d'accordo con l'autore. Ho letto "Ottieni la versione più recente" come "Ottieni la versione più recente dal server" (da dove altro la troverei?). In VS2010 ho ottenuto Ottieni la versione più recente e ho detto che ho l'ultima versione, ma se faccio un confronto elenca le differenze tra la versione locale e quella più recente del server. Sono d'accordo che non sovrascriva il lavoro locale, ma dovrebbe almeno fare un confronto con il timestamp e non indurmi in errore con "Hai l'ultima versione". Quando ho eliminato la versione locale, Get Latest Version ha funzionato come previsto.
Swanny,

42

A volte Get specific version anche selezionando entrambe le caselle di controllo non otterrai l'ultimo file. Probabilmente hai apportato una modifica a un file e desideri annullare tali modifiche recuperando l'ultima versione. Bene ... questo è ciò che Undo pending changesserve e non lo scopo Get specific version.

Se in dubbio:

  • annulla il check-in in sospeso sui file
  • fare un confronto in seguito per assicurarsi che il file corrisponda alla versione prevista
  • in seguito esegui un 'confronto' ricorsivo su tutto il tuo progetto per vedere cos'altro è diverso
  • tenere d'occhio la finestra delle modifiche in sospeso e, talvolta, potrebbe essere necessario selezionare "accetta versione server" per risolvere una modifica in sospeso incompatibile

E questo è il mio preferito che ho appena scoperto:

  • tieni d'occhio nella Outputfinestra i messaggi come questo:

    Avviso - Impossibile aggiornare R: \ TFS-PROJECTS \ www.example.com \ ExampleMVC \ Example MVC \ Example MVC.csproj perché hai una modifica in sospeso.

Questo messaggio critico viene visualizzato nella finestra di output. Nessuna altra notifica! Niente in attesa di modifiche e nessun altro messaggio di dialogo che ti dice che il file che hai appena richiesto esplicitamente non è stato recuperato! E sì, risolvi semplicemente eseguendo Undo pending changese ottenendo il file.


Grazie, la tua risposta ( Undo pending changes) ha funzionato per me.
RAM

Assicurati di annullare solo le modifiche al file che vuoi veramente sostituire e non tutto ciò su cui stai lavorando
Simon_Weaver

@Simon_Weaver Grazie a questo risolto il mio problema, ha senso il motivo per cui sta accadendo comunque super fastidioso.
nulltron

12

TFS, come alcuni altri provider di controllo del codice sorgente, come Perforce, lo fanno, poiché il sistema sa quale era l'ultima versione che hai ottenuto correttamente, quindi ottieni le ultime trasformazioni in "ottieni modifiche da x". Se giochi secondo le sue regole e controlli le cose prima di modificarle, non confondi le cose e "get latest" fa davvero come dice.

Come hai visto, puoi forzarlo a rivalutare tutto, il che ha un utilizzo della larghezza di banda molto maggiore, ma si comporta più vicino al modo in cui SourceSafe era solito.


11

È difficile rispondere a una dichiarazione senza esempi di come non funzioni, ma è fondamentale capire che TFVC (in modalità "Area di lavoro del server", che era il meccanismo precedente a TFS 2012) non esamina lo stato del file system locale . Le aree di lavoro del server TFVC sono un tipo di sistema "checkout-edit-checkin" in cui è una progettazione, una decisione intenzionale presa per ridurre in modo massiccio la quantità di I / O dei file richiesta per determinare lo stato dell'area di lavoro. Al contrario, le informazioni sull'area di lavoro vengono salvate sul server.

Ciò consente agli spazi di lavoro del server TFVC di scalare in modo molto efficiente basi di codice molto grandi. Se ti trovi in ​​una base di codice multi-gigabyte (come Visual Studio o l'albero dei sorgenti di Windows), il tuo client non ha bisogno di scansionare il tuo filesystem locale, alla ricerca di file che potrebbero essere cambiati, perché il contratto che hai con TFS è che tu controllerà esplicitamente un file quando si desidera modificarlo.

Non devi contrassegnare un file come di sola scrittura e modificarlo senza prima verificarlo esplicitamente. Se segui questa strada, il server non sa che hai apportato modifiche al tuo file e l'esecuzione di un'operazione "Ottieni le ultime" non aggiornerà l'area di lavoro locale, perché non hai comunicato al server che hai effettuato i cambiamenti.

Se fai sovvertire questo meccanismo, è possibile utilizzare il tfpt reconcilecomando per esaminare il vostro spazio di lavoro locale per le modifiche che avete fatto a livello locale.

Se ti ritrovi a utilizzare "Ottieni versione specifica" e selezionando le opzioni "forza" e "sovrascrivi", è molto probabile che tu abbia l'abitudine di aggirare tutte le forze di sicurezza che TFS ha implementato per impedirti di farti del male, e dovresti probabilmente considerare gli ambienti di lavoro locali TFVC.

Le aree di lavoro locali di TFVC forniscono un tipo di sistema di controllo della versione "edit-merge-commit", il che significa che non è necessario controllare esplicitamente i file prima di modificarli e non sono di sola lettura su disco. Invece, devi semplicemente modificare il file e il tuo client eseguirà la scansione del filesystem, noterà la modifica e la presenterà come una modifica in sospeso.

Le aree di lavoro locali TFVC sono consigliate per piccoli progetti che non richiedono un controllo delle autorizzazioni dettagliato, poiché presentano un flusso di lavoro molto più efficiente. Non è necessario essere online e non è necessario controllare esplicitamente i file prima di modificarli.

Le aree di lavoro locali TFVC sono quelle predefinite in TFS 2012 e, se non sono abilitate per te, dovresti chiedere al tuo amministratore del server. (Le organizzazioni con basi di codice molto grandi o requisiti di controllo rigorosi possono disabilitare gli spazi di lavoro locali TFVC.)

L'eccellente libro di Eric Sink Controllo della versione per esempio delinea le differenze tra i sistemi di checkout-edit-checkin e edit-merge-commit e quando uno è più appropriato dell'altro.

Il libro Professional Team Foundation Server 2013 fornisce inoltre informazioni eccellenti sulle differenze tra gli spazi di lavoro del server TFVC e gli spazi di lavoro locali TFVC. La documentazione e i blog MSDN forniscono anche informazioni dettagliate:


Ottima risposta informativa, ma non sono sicuro che il "contrassegno di un file come di sola scrittura" risponda all'OP. So che sto usando Visual Studio (ora 2013) per apportare tutte le mie modifiche ai file * .cs in un progetto MVC .NET e quando accendo il mio laptop, "Get Latest" spesso mi lascia sospeso al punto che sto quasi imparando il carico "Avanzate >>> Ottieni specifiche >>> Ultime >>> Sovrascrivi" ora. Non ci sono modifiche o check-in al di fuori di VS. VS trova i file che ho modificato e li inserisce correttamente nelle modifiche in sospeso. Li controllo con VS. Non riesco a vedere nulla che possa "farmi del male", ma le ultime novità non funzionano in modo affidabile. ??
ruffin,

@Ruffin Stai dicendo che hai gli ultimi blocchi ? Non era quello che interpretavo la domanda del PO. Finisce mai? Altre operazioni sono lente o sono solo Get? Get w / Overwrite è mai lento o è solo il solito Get Latest?
Edward Thomson,

No, non si blocca. Posso ottenere le ultime e sembra funzionare (e funzionare ragionevolmente rapidamente), ma i file non cambiano. Se lo faccio Ottieni specifici >>> Ultimi >>> Sovrascrivi, proprio come i suggerimenti di @NotMe , i file "recuperano". Aringhe probabilmente rosse: succede occasionalmente anche con gli Shelfset. Sì, i miei percorsi di lavoro sono corretti o Get Specific non funzionerebbe, non credo.
Rufin,

Non ho un buon suggerimento qui. Vorrei che contattassi l'assistenza se hai un problema di vecchia data che ritieni possa essere un bug. Che si tratti di un bug o meno, dovresti ottenere una soluzione a questo problema.
Edward Thomson,

6

Team Foundation Server (TFS) tiene traccia della sua copia locale in una directory nascosta chiamata $ TF.Quando si emette la "versione più recente", TFS cerca in questa cartella e vede che ho l'ultima copia o meno. In caso contrario, non scaricherà l'ultima copia. Non importa se si dispone o meno del file originale. In effetti potresti aver eliminato l'intera cartella (come nel mio caso) e TFS non recupererà la copia più recente perché non guarda nel file effettivo ma la directory nascosta in cui registra cambia. Il difetto di questo design è che qualsiasi cosa fatta al di fuori del sistema non verrà registrata in TFS. Ad esempio, è possibile accedere a Esplora risorse di Windows, eliminare una cartella o un file e TFS non lo riconoscerà. Sarà totalmente cieco. Almeno mi sarei aspettato che Windows non ti permettesse di eliminare questo file ma lo fa!

Un modo per applicare l'ultima copia è eliminare manualmente la cartella nascosta $ TF. Per fare ciò, vai al prompt dei comandi e vai alla cartella principale in cui è stato estratto il progetto ed emetti questo comando

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

Se vuoi semplicemente controllare la cartella nascosta, puoi farlo usando

dir /ah                    // display hidden files and folders

Nota: se lo fai, il tf penserà di non avere alcuna copia locale anche se ce l'hai nei file e sincronizzerà di nuovo tutto.

Attenzione: utilizzare questo metodo a proprio rischio. Si prega di non utilizzarlo per lavori critici.


Questo ha funzionato per me quando nient'altro ha fatto. Ho provato a ottenere una versione specifica e ho selezionato entrambe le caselle di controllo per forzare il download, ma questo non ha ottenuto i file. Penso che qualcosa sia stato corrotto. Ma questa soluzione ha funzionato.
Francisco d'Anconia,

3

"Ottieni la versione più recente" per impostazione predefinita scaricherà solo i file che sono stati modificati sul server dall'ultima volta che hai eseguito "Ottieni la versione più recente". TFS tiene traccia dei file scaricati in modo da non perdere tempo a scaricare di nuovo la stessa versione dei file. Se stai modificando i file al di fuori di Visual Studio, ciò può causare i problemi di coerenza che sembra che stai vedendo.


3

Sfortunatamente, ci devono essere uno o più bug in TFS 2008, poiché questo problema affiora regolarmente su macchine sviluppatore e costruisce server dove lavoro anche io.

Posso fare Get Latest, posso vedere nell'elenco cronologico del progetto che ci sono stati dei commit dopo l'ultima esecuzione di Get Latest, non ho toccato i file sul disco in alcun modo, ma dopo che la funzione "Get Latest" ha completato, quando controllo la scheda TFS, alcuni dei file dicono ancora che non sono l'ultima versione.

Ovviamente TFS è in grado di determinare che ho file vecchi localmente, dal momento che l'elenco lo dice. Tuttavia, Get Latest non riesce a farlo, ottieni l'ultima versione. Se faccio quello che hai fatto, utilizza la versione di Get Specific e seleziona le due caselle di controllo nella parte inferiore della finestra di dialogo, quindi i file vengono recuperati.

Abbiamo modificato i nostri server di build per utilizzare sempre invece il tipo di funzione Ottieni versione specifica, quindi questa parte ora funziona, ma poiché il nostro server di build (TeamCity) si affida anche al controllo di eventuali modifiche ai file per dare il via a una build , a volte finisce in una modalità "niente è cambiato, niente da vedere qui, spostati" e non fa nulla fino a quando non eseguiamo forzatamente la configurazione della build.

Si noti che ho riscontrato questo problema su una macchina che non viene mai toccata, ad eccezione di get latest + build, entrambi manualmente, quindi non c'è nulla di manomissione dei file. È solo TFS che si confonde.

Una volta spuntato ciò, ho verificato che i file sul disco erano effettivamente binari identici alla versione precedentemente recuperata, quindi non è stata effettuata alcuna manomissione manuale dei file.

Inoltre, non riesco a vedere come TFS può "sapere" se i file sono cambiati sul disco o meno senza effettivamente guardare il contenuto. Se una parte di TFS riesce a vedere che i file in realtà non sono la versione più recente, la versione più recente dovrebbe essere assolutamente in grado di ottenere la versione più recente. Questo in riferimento ai commenti ad altre risposte qui.


TFS dipende dal numero di versione di un file per sapere se si dispone o meno della versione "più recente". Quel numero viene mantenuto interamente in TFS e viene aggiornato solo quando qualcuno effettua un check-in. Quindi, quando ottieni "Più recenti", TFS controlla il suo database per vedere quale era l'ultima versione che ti è stata inviata. Se questo numero è uguale alla versione corrente, allora ritiene che tu abbia l'ultima; indipendentemente da ciò che è effettivamente nel tuo file system locale. L'idea era di limitare il traffico di rete. Sfortunatamente, l'unico modo in cui funziona questo modello è se tutte le modifiche avvengono all'interno di un'applicazione con conoscenza di TFS.
NotMe,

Inoltre, sono d'accordo che esiste almeno un bug con la versione 2005/08 di questo. Ho visto i problemi esatti che hai descritto su più macchine; che è ciò che mi ha portato a utilizzare religiosamente la versione di Get Specific.
NotMe,

In alcuni casi, le modifiche sono state apportate interamente all'interno di Visual Studio su una macchina, l'altra macchina, il cui unico scopo è quello di ottenere l'ultima build +, nessuna modifica locale è mai stata fatta. Eppure riesce a rovinare tutto. Non sono impressionato dal controllo del codice sorgente TFS per non dire altro. Speriamo che il 2010 abbia meno di questi problemi.
Lasse V. Karlsen

3

Potrebbe essere perché accedi a TFS come lo stesso utente e anche il nome dell'area di lavoro (basato sul nome della macchina per impostazione predefinita) è lo stesso, quindi TFS pensa che tu sia sulla stessa macchina e sullo stesso spazio di lavoro, quindi hai già l'ultima versione di i file, quindi non li riceverai per te.

prova a rinominare il tuo computer e crea un nuovo spazio di lavoro come nuovo computer.


2

Ho avuto lo stesso problema con Visual Studio 2012. Indipendentemente da ciò che ho fatto, non ho ottenuto il codice dal controllo del codice sorgente TFS.

Nel mio caso, la causa è stata la mappatura di una cartella + sottocartella dal controllo del codice separatamente ma allo stesso albero nel mio HD locale.

La soluzione stava rimuovendo il mapping delle sottocartelle usando la finestra "gestisci aree di lavoro".


1

La maggior parte dei problemi che ho riscontrato con gli sviluppatori che si lamentano del fatto che Get Latest non fa quello che si aspettano derivano dal fatto che stanno eseguendo Get Latest da Solution Explorer piuttosto che da Source Control Explorer. Solution Explorer ottiene solo i file che fanno parte della soluzione e ignora tutto ciò che potrebbe essere richiesto dai file all'interno della soluzione, e quindi parte del controllo del codice sorgente, mentre Explorer controllo del codice sorgente confronta l'area di lavoro locale con il repository sul server per determinare quali file sono necessari.


L'ho provato da Team Explorer, sempre con lo stesso risultato. Nel mio caso ho eliminato la cartella e volevo ottenere di nuovo l'ultima copia, ma senza fortuna.
Hammad Khan,

1
Non sono d'accordo con questa risposta. Se avete progetti utilizzati da diverse soluzioni condivisa, è necessario farlo in Esplora soluzioni, altrimenti sarà solo fare un Get su quel particolare percorso TFS
Riegardt Steyn

Perché aggiungere l'opzione da Esplora soluzioni se non si prevede di utilizzarla? Quando ho fatto clic su "Mostra tutti i file" il file era lì ma non incluso nel mio progetto. Strano dal momento che non ero nemmeno quello che l'aveva aggiunto.
mokumaxCraig

1

Quando riscontro questo problema senza che si ottenga l'ultima versione e non corrisponda alla versione, per prima cosa eseguo una "Versione specifica" impostandola su changeset e inserendola in 1. Ciò rimuoverà quindi tutti i file dallo spazio di lavoro locale (per quel progetto, cartella, file, ecc.) e avrà anche l'aggiornamento TFS in modo che sappia che ora NON hai VERSIONE SCARICATA. Puoi quindi fare un "Get Latest" e viola, in realtà avrai le ultime


1

Potrebbe accadere quando usi TFS da due macchine diverse con lo stesso account, in tal caso dovresti confrontare per vedere i file modificati e verificarli, quindi ottenere le ultime novità e annullare le modifiche in sospeso per rimuovere il checkout


1

Questo ha funzionato per me:
1. Esci da Visual Studio
2. Apri una finestra di comando e vai alla cartella: "% localappdata% \ Local \ Microsoft \ Team Foundation \"
3. Passa alle sottocartelle per ogni versione ed elimina la sottocartella "cache" e i suoi contenuti
4. Riavviare Visual Studio e connettersi a TFS.
5. Prova la versione più recente.


0

voglio solo aggiungere TFS MSBuild non supporta caratteri speciali nelle cartelle, ad esempio "@"

avevo sperimentato in passato in cui una delle nostre cartelle di progetto era denominata External @ Project1

abbiamo creato una definizione di build TFS per eseguire un file msbuild personalizzato, quindi la cartella dell'area di lavoro non sta ottenendo alcun contenuto nella cartella External @ Project1 durante l'ultima area di lavoro. Sembra che tfs get non riesca ma non mostri alcun errore.

dopo alcuni tentativi ed errori e rinominare la cartella in _Project1. voilà abbiamo i file nella cartella (_Project1).


TFS o no, non dovresti mai usare caratteri speciali nei nomi delle cartelle di progetto!
Riegardt Steyn,

@ non è speciale. E nemmeno%, ecc. Ecc. È solo la pigrizia da parte di Microsoft che fa sì che tali caratteri vengano trattati in modo diverso dai caratteri "normali".
Kevin Whitefoot,

0

Strumento: utensili elettrici TFS

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

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

Verrà visualizzata una finestra di dialogo che ti chiederà di eliminare o scaricare un elenco di file. Seleziona o Deseleziona i file di conseguenza e premi ok. Aspetto nella griglia (CheckBox, FileName, FileAction, FilePath)

Causa: TFS confronta solo con gli elementi nell'area di lavoro. Se sono state apportate modifiche al di fuori dell'area di lavoro, TFS non ne sarà a conoscenza.

Spero che qualcuno lo trovi utile. Ho trovato questo post dopo aver eliminato una manciata di cartelle in varie posizioni. Non ricordare quali cartelle ho eliminato escludeva la solita opzione Forza Get / Sostituisci che avrei usato.


0

Nel mio caso, Ottieni versione specifica, anche selezionando entrambe le caselle di controllo e annullando tutte le modifiche in sospeso non ha funzionato.

Controllato gli spazi di lavoro. Modifica area di lavoro corrente. Controlla tutti i percorsi. Il percorso della soluzione era errato e puntava a una cartella eliminata.

Risolto il problema e l'ultimo funzionava bene.


0

Vai con il tasto destro: Avanzate> Ottieni versione specifica . Seleziona "Letest Version" e ora, importante, segna due controlli: inserisci qui la descrizione dell'immagine

I controlli sono:
Sovrascrivi i file scrivibili che non sono stati controllati

Sovrascrivi tutti i file anche se la versione locale corrisponde alla versione specificata


Descrivi gli elementi che devono essere controllati anziché pubblicare uno screenshot.
Chuck Adams,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.