Чому TFS не отримує останню інформацію?


177

Чому Чому ЧОМУ не послідовно отримують останню роботу TFS?

Ви могли б подумати, що ця функція була б випробувана ретельно.

Що мені потрібно зробити, це отримати конкретну версію, а потім перевірити обидва перезаписані файли + перезаписати всі файли.

Моє місцеве налаштування зіпсовано чи це ви також робите?


Дурніше, що я бачу, це те, що "Отримати останню версію" нічого не робить, навіть коли локальний файл був видалений з будь-якої причини. Я б подумав, що перевірка того, що локальний файл принаймні існує, була досить очевидною справою. Але чому він не може просто порівняти часовий штамп кожного файлу на сервері з часом, коли ви останній раз отримали (який можна зберігати десь локально), мене здивує.
Ділан Ніколсон

Це має бути коментар.
Jimenemex

Відповіді:


118

TFS переосмислив те, що робить "Отримайте останні". Згідно з умовами TFS, Get Latest означає отримати останню версію файлів, але ігноруйте ті, які сервер вважає, що вже є у вашій робочій області. Що зі мною і майже з усіма іншими на планеті помиляється.

Перейдіть за цим посиланням: http://blogs.microsoft.co.il/blogs/srlteam/archive/2009/04/13/how-get-latest-version-really-works.aspx

Єдиний спосіб змусити його виконати те, що ви хочете, - це отримати конкретну версію, після чого встановіть прапорець "Переписати ...".


7
Це не правильно. TFS "отримати найновіші" працює точно так само, як рекламується, доки TFS знає про зміни у файлах. Отримайте останнє лише "накручуючи", коли люди виходять і змінюють подані документи за межами IDE, не перевіряючи їх спочатку. Тоді TFS вважає, що у вас є останнє джерело на диску, і не отримує його.
Робатикус

18
@Robaticus Як реально рекламується tfs "отримує найновіший" так само, як Кріс жваво говорив раніше, він і всі на планеті розуміють, що "отримати найновіший" отримати найновішу версію, яка не є тим, що зробив би TFS. вам не потрібно редагувати джерело за межами tfs, щоб зіпсувати його. У мене є 2 робочі станції і працюють взаємозамінно, і я просто не можу отримати джерело синхронізації. отримати останню версію - це вже клопоту з TFS, і я не можу уявити, що злиття хотілося б.
Syaiful Nizam Yahya

2
@publicENEMY, я працював з tfs на двох машинах, справді це проблема синхронізації джерела. Для цього вам можуть знадобитися два користувачі tfs ...
kroiz

11
Тьфу! Це біль. Visual Studio може легко заплутатися, а іноді виправити це у файловій системі - це найпростіший спосіб. Інші системи управління джерелами, такі як Subversion, мають гачки провідника Windows, і це, і інтеграція VS краще справляють моніторинг змін. Я сумую за SVN!
Dan Csharpster

3
Я згоден з автором. Я читав "Отримати останню версію" як "Отримати останню версію з сервера" (звідки б я її ще отримував?). У VS2010 я отримав останню версію і сказав, що я маю останню версію, але якщо я порівняю, він перераховує відмінності між локальною та останньою версією сервера. Я гаразд з тим, що він не перезаписує локальну роботу, але він повинен принаймні зіставити часові позначки та не вводити мене в оману із "У вас остання версія". Коли я видалив локальну версію, Get Last Version працював так, як очікувалося.
Swanny

42

Іноді Get specific version навіть встановлення обох прапорців не отримає найновіший файл. Ви, ймовірно, внесли зміни до файлу і хочете скасувати ці зміни, отримавши останню версію. Ну ... це для чого Undo pending changes, а не мета Get specific version.

Якщо сумніваєтесь:

  • скасувати чекання реєстрації у файлі (файлах)
  • зробіть порівняння після цього, щоб переконатися, що ваш файл відповідає очікуваній версії
  • після цього запустіть рекурсивне "порівняння" для всього вашого проекту, щоб побачити, що ще відрізняється
  • слідкуйте за вікном змін, що очікують на розгляд, і іноді вам може знадобитися встановити "прийняти версію сервера", щоб вирішити несумісні зміни, що очікують на розгляд

І це моє улюблене, що я щойно виявив:

  • стежте у Outputвікні на такі повідомлення:

    Попередження - не вдається оновити R: \ TFS-PROJECTS \ www.example.com \ ExampleMVC \ Example MVC \ Example MVC.csproj, оскільки у вас є редакція в очікуванні.

Це критичне повідомлення з'являється у вікні виводу. Ніяких інших сповіщень! Нічого в очікуванні змін і жодного іншого діалогового повідомлення, яке б не вказувало на те, що файл, який ви явно запитували, не був отриманий! І так - ви вирішите це, просто запустивши Undo pending changesта отримавши файл.


Дякую, ваша відповідь ( Undo pending changes) працювала на мене.
ОЗУ

Просто переконайтесь, що скасуєте лише ті зміни у файлі, який ви дійсно хочете замінити, а не все, над чим працюєте
Simon_Weaver

@Simon_Weaver Завдяки цьому було вирішено мою проблему, є сенс, чому це все ще надто дратує.
nulltron

12

TFS, як і інші постачальники управління джерелами, такі як Perforce, роблять це, оскільки система знає, що була остання версія, яку ви успішно отримали, тому отримайте останні перетворення на "отримати зміни з x". Якщо ви граєте за його правилами і насправді перевіряєте речі, перш ніж редагувати їх, ви не плутаєте справи, а "отримувати останню версію" дійсно так, як говориться.

Як ви вже бачили, ви можете змусити його переосмислити все, що має набагато більше використання пропускної здатності, але поводиться ближче до того, як раніше SourceSafe.


11

Важко реагувати на заяву без прикладів того, як це не працює, але важливо розуміти, що TFVC (в режимі «Робоча область сервера», який був механізмом до TFS 2012) не вивчає стан вашої локальної файлової системи . Робочі простори сервера TFVC - це система типу "замовлення-редагування-перевірка", де це побічна конструкція, навмисне рішення, яке приймається для масового зменшення кількості вводу-виводу файлів, необхідного для визначення стану вашої робочої області. Натомість інформація про робочу область зберігається на сервері.

Це дозволяє робочим просторам сервера TFVC масштабувати до дуже великих бази коду дуже ефективно. Якщо ви перебуваєте в багатогігабайтній кодовій базі (наприклад, Visual Studio або джерельному дереві Windows), то вашому клієнту не потрібно сканувати вашу локальну файлову систему, шукаючи файли, які можуть бути змінені, оскільки у вас є контракт з TFS, що ви явно перевірятиме файл, коли ви бажаєте його відредагувати.

Очікується, що ви не позначите файл як лише для запису та зміните його, не попередньо перевіряючи його. Якщо ви спускаєтесь по цьому маршруту, сервер не знає, що ви внесли зміни у свій файл, і виконавши операцію "Отримати останню", ви не оновите локальну робочу область, оскільки ви не сказали серверу, що ви зробили зміни.

Якщо ви робите підривати цей механізм , то ви можете використовувати tfpt reconcileкоманду , щоб вивчити локальне робоче простір для змін , які ви зробили на місці.

Якщо ви виявите, що використовуєте "Отримати конкретну версію" та вибираєте параметри "примусити" та "перезаписати", то дуже ймовірно, що у вас є звичка обійти всі правозастосування, які впроваджено TFS, щоб не зашкодити собі, і вам, мабуть, слід врахувати локальні робочі простори TFVC.

Місцеві робочі простори TFVC надають тип системи управління версіями типу "редагувати-об'єднувати-фіксувати", що означає, що вам не потрібно чітко перевіряти файли перед редагуванням, і вони не є лише для читання на диску. Натомість вам просто потрібно відредагувати файл, і ваш клієнт сканує файлову систему, помітить зміни та представить це як очікуване зміна.

Місцеві робочі простори TFVC рекомендуються для невеликих проектів, які не потребують тонкого контролю дозволів, оскільки вони представляють набагато приємніший робочий процес. Ви не зобов'язані бути в Інтернеті, і вам не потрібно чітко перевіряти файли перед їх редагуванням.

Місцеві робочі простори TFVC є типовими в TFS 2012, і якщо вони не ввімкнено для вас, вам слід звернутися до адміністратора сервера. (Організації з дуже великими базами коду або суворими вимогами до аудиту можуть вимкнути локальні робочі простори TFVC.)

Прекрасна книга Еріка Сінка « Контроль версій за прикладом» окреслює відмінності між системами оформлення замовлення-редагування, реєстрації та редагування-злиття-введення та коли одна є більш доцільною, ніж інша.

Книга Professional Team Foundation Server 2013 також надає чудову інформацію про відмінності між робочими просторами сервера TFVC та локальними робочими просторами TFVC. Документація та блоги MSDN також надають детальну інформацію:


Чудова, інформативна відповідь, але я не впевнений, що "маркування файлу як лише для запису" відповідає ОП. Я знаю, що я використовую Visual Studio (зараз 2013) для внесення всіх моїх змін у файли * .cs у проекті MVC .NET, і коли я запускаю свій ноутбук, "Отримати останнє" часто залишає мене звисаючим до я Я майже вантажний "Кращий >>> Отримати конкретні >>> Останні >>> Перезаписати" зараз. Немає редагування чи реєстрації за межами VS. VS знаходить файли, які я відредагував, і належним чином розміщує їх у очікуванні змін. Я перевіряю їх у VS. Я не бачу нічого, що могло б "нашкодити собі", але отримати останню не надійно. ??
ruffin

@ruffin Ви хочете сказати , що отримати найостанніші висне ? Це не те, що я тлумачив питання ОП. Чи закінчується це коли-небудь? Чи інші операції повільні, або просто отримання? Чи стає функція W w / Overwrite завжди повільною чи просто звичайною Отримати останню?
Едвард Томсон

Ні, не висить. Я можу отримати останнє, і, здається, він працює (і працює досить швидко), але файли не змінюються. Якщо я отримаю конкретні >>> Останні >>> Перепишіть, як і пропозиції @NotMe , файли "наздоганяють". Вірогідна червона оселедець: Також періодично трапляється з шельфами. Так, мої робочі шляхи правильні, або Get Specific не працює, я не вірю.
ruffin

Я не маю хорошої пропозиції тут. Я хочу, щоб ви звернулися до служби підтримки, якщо у вас є давня проблема, яка, на вашу думку, може бути помилкою. Невже це помилка чи ні, ви повинні вирішити цю проблему.
Едвард Томсон

6

Team Foundation Server (TFS) відслідковує свою локальну копію у прихованому каталозі під назвою $ TF. Коли ви видаєте "Отримати останню версію", TFS заглядає в цю папку і бачить, у мене є остання копія чи ні. Якщо це зробити, він не завантажить останню копію. Не має значення, маєте ви оригінальний файл чи ні. Насправді ви, можливо, видалили всю папку (як у моєму випадку), і TFS не отримає останню копію, оскільки вона не заглядає у власне файл, а у прихований каталог, де він записує зміни. Недолік цієї конструкції полягає в тому, що все, що зроблено поза системою, не буде записано в TFS. Наприклад, ви можете зайти в Windows Explorer, видалити папку або файл і TFS не зможе розпізнати його. Це буде абсолютно сліпо. Принаймні, я б очікував, що там Windows не дозволить вам видалити цей файл, але це так!

Один із способів застосувати останню копію - видалити приховану папку $ TF вручну. Для цього перейдіть до командного рядка та перейдіть до кореневої папки, де ви перевірили проект, і видайте цю команду

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

Якщо ви хочете просто перевірити приховану папку, ви можете зробити це за допомогою

dir /ah                    // display hidden files and folders

Примітка. Якщо ви це зробите, tf подумає, що у вас немає локальної копії, навіть якщо вона є у файлах, і вона буде синхронізувати все знову.

Увага: Використовуйте цей метод на свій страх і ризик. Будь ласка, не використовуйте його на критичних роботах.


Це працювало для мене, коли нічого іншого не робив. Я спробував отримати конкретну версію і встановив обидві прапорці, щоб змусити завантажувати, але файли не отримали. Я думаю, що щось було корумповане. Але це рішення спрацювало.
Франсіско д'Анконія

3

"Отримати останню версію" за замовчуванням завантажуватимуться лише ті файли, які були змінені на сервері з моменту останнього запуску "Отримати останню версію". TFS відслідковує завантажені файли, щоб не витрачати час на повторне завантаження тієї ж версії файлів. Якщо ви змінюєте файли за межами Visual Studio, це може спричинити проблеми з узгодженістю, які здаються вам подібними.


3

На жаль, у TFS 2008 має бути одна чи більше помилок, оскільки ця проблема регулярно виникає на машинах розробників та створює сервери, де я також працюю.

Я можу зробити "Останнє", я бачу в списку історії проекту, що відбулися комісії після того, як я востаннє робив "Останнє отримання", я жодним чином не торкався файлів на диску, але після того, як функція "Отримати останнє" має завершено, коли я перевіряю вкладку TFS, деякі файли все ще говорять про те, що вони не є останньою версією.

Очевидно, TFS здатний визначити, що я маю старі файли локально, оскільки список говорить про це. І все-таки, "Отримати останнє" не вдається цього, отримайте найновішу версію. Якщо я роблю те, що ви зробили, використовуйте версію Get Specific і встановіть два прапорці внизу діалогового вікна, після чого файли будуть отримані.

Ми змінили наші сервери збирання, щоб замість цього завжди використовувати тип функції конкретної версії, тому ця частина тепер працює, але оскільки наш сервер збирання (TeamCity) також покладається на перевірку, чи були зміни у файлах, щоб розпочати збірку , іноді він перепадає в режим "нічого не змінилося, тут нічого не бачити, рухатися" і нічого не робить, поки ми не запустимо конфігурацію збірки.

Зауважте, що я відчував цю проблему на машині, яка ніколи не торкається, за винятком отримання останньої + збірки, як вручну, так що нічого не має підробляти файли. Це просто TFS плутається.

Одного разу під час цього обрізання я перевірив, що файли на диску справді є бінарними ідентичними попередньо отриманій версії, тому жодного ручного підроблення файлів не робилося.

Крім того, я не бачу, як TFS може "знати", змінилися файли на диску чи ні, не переглядаючи вміст. Якщо в одній частині TFS можна побачити, що файли справді не є останньою версією, то версія "Остання версія" абсолютно повинна мати можливість отримати останню версію. Це посилання на коментарі до інших відповідей тут.


TFS залежить від номера версії файлів, щоб знати, чи є у вас "остання" версія чи ні. Це число повністю підтримується в TFS і оновлюється лише тоді, коли хтось робить реєстрацію. Отже, коли ви "Отримати останню", TFS перевіряє свою базу даних, щоб побачити, яка була остання надіслана вами версія. Якщо це число дорівнює поточній версії, то він вважає, що у вас є остання; незалежно від того, що є насправді у вашій локальній файловій системі. Ідея полягала в обмеженні мережевого трафіку. На жаль, єдиний спосіб роботи цієї моделі полягає в тому, якщо всі редагування відбуваються в програмі, яка володіє знаннями TFS.
NotMe

Крім того, я погоджуюся, що принаймні одна помилка є версією 2005/08 року. Я бачив точні проблеми, які ви описали на кількох машинах; саме це змушує мене релігійно використовувати Get Specific версію.
NotMe

В деяких випадках редагування повністю відбуваються в Visual Studio на одній машині, в іншій машині, єдиною метою якої є отримання останнього + збірки, жодних локальних змін не проводиться ніколи. І все-таки це вдається викрутити. Мене не вражає TFS Source Control. Сподіваємось, у 2010 році таких проблем буде менше.
Лассе В. Карлсен

3

Це може бути через те, що ви ввійшли в систему TFS як той самий користувач, а ім’я робочої області (засноване на імені машини за замовчуванням) також є однаковим, тому TFS вважає, що ви знаходитесь на одній машині і тій же робочій області, тому у вас вже є остання версія файли, тож він не зможе їх отримати за вас.

спробуйте перейменувати свою машину та створити нову робочу область як нову машину.


2

У мене був такий самий випуск з Visual Studio 2012. Незалежно від того, що я робив, він не отримав код від контролю джерел TFS.

У моєму випадку причиною було зіставлення папки + підпапки з елемента керування джерелом окремо, але до того самого дерева в моєму локальному HD.

Рішенням було видалення відображення підпапок за допомогою вікна "керувати робочими просторами".


1

Більшість проблем, які я бачив із розробниками, які скаржаться на те, що Get Latest не робить того, чого вони очікують, випливає з того, що вони виконують Отримати останнє із Explorer Explorer, а не з Explorer Control Explorer. Провідник рішень отримує лише ті файли, які є частиною рішення, і ігнорує все, що може знадобитися файлам у межах рішення, а отже, частиною контролю джерела, тоді як Explorer Control Explorer порівнює ваше місцеве робоче поле з сховищем на сервері, щоб визначити, які файли потрібні.


Я спробував це в Team Explorer, все одно той же результат. У моєму випадку я видалив папку і хотів отримати останню копію знову, але не пощастило.
Хаммад Хан

1
Я не згоден з цією відповіддю. Якщо у вас є спільні проекти, що використовуються різними рішеннями, вам доведеться робити це в Провіднику рішень, інакше він просто
зробиться

Навіщо додавати опцію з Провідника рішень, якщо ви її не використовуєте? Коли я натиснув "Показати всі файли", файл був там, але не був включений у мій проект. Дивно, оскільки я навіть не був тим, хто додав його.
mokumaxCraig

1

Коли я зіткнувся з цією проблемою, не отримуючи останню версію та невідповідність версій, спершу роблю "Отримати конкретну версію", встановивши її на наборі змін і вставте 1. Потім вилучите всі файли з вашої локальної робочої області (для цього проекту, папки, файл тощо), і він також матиме оновлення TFS, щоб він знав, що зараз у вас НЕ ЗАВАНТАЖЕНА ВЕРСІЯ. Потім ви можете зробити "Останнє" та віолу, у вас насправді буде найновіше


1

Це може статися, коли ви використовуєте TFS на двох різних машинах з одним і тим же обліковим записом, якщо так, вам слід порівняти, щоб переглянути змінені файли та перевірити їх, а потім отримати останні, а потім скасувати зміни, щоб видалити замовлення


1

Це працювало для мене:
1. Вийдіть із Visual Studio
2. Відкрийте вікно команд та перейдіть до папки: "% localappdata% \ Local \ Microsoft \ Team Foundation \"
3. Перейдіть до підпапок для кожної версії та видаліть папку sub. "кеш" та його вміст
4. Перезавантажте Visual Studio і підключіться до TFS.
5. Перевірте найновішу версію.


0

просто хочу додати TFS MSBuild не підтримує спеціальних символів у папках, тобто "@"

я раніше переживав, коли одна з наших папок проекту називалася Зовнішньою @ Project1

ми створили визначення TFS Build для запуску користувальницького файлу msbuild, тоді папка робочої області не отримує вмісту в папці External @ Project1 під час отримання робочої області останньою. Здається, що отримання tfs виходить з ладу, але не показує помилок.

після деяких спроб та помилок та перейменування папки в _Project1. voila Ми отримали файли в папці (_Project1).


TFS чи ні, ви ніколи не повинні використовувати спеціальні символи у назвах папок проекту!
Геліяк

@ не є особливим. І не%, і т. Д. Інакше лінь з боку Microsoft спричиняє трактування таких символів інакше, ніж "нормальні" символи.
Кевін Уайтфут

0

Інструмент: електроінструменти TFS

Джерело: http://dennymichael.net/2013/03/19/tfs-scorch/

Команда: tfpt scorch / рекурсивна / видаляє C: \ LocationOfWorkspaceOrFolder

Після цього з’явиться діалогове вікно, в якому буде запропоновано Видалити або завантажити список файлів. Виберіть або Скасуйте вибір відповідно файлів і натисніть ОК. Зовнішній вигляд в Grid (CheckBox, FileName, FileAction, FilePath)

Причина: TFS порівнюватиме лише з предметами в робочій області. Якщо зміни внесені за межами робочої області, TFS про них не знає.

Сподіваємось, хтось вважає це корисним. Я знайшов цю публікацію після видалення кількох папок у різних місцях. Не пам'ятаючи, які папки, які я видалив, виключався звичайний варіант Get / Заміна, який я використовував.


0

У моєму випадку отримати конкретну версію, навіть встановити прапорці та скасувати всі очікувані зміни не вийшло.

Перевірив робочі місця. Редагуйте поточну робочу область. Перевірте всі шляхи. Шлях рішення був неправильним і вказував на видалену папку.

Виправлено шлях і виберіть останню роботу.


0

Перейдіть правою кнопкою миші: Додатково> Отримати конкретну версію . Виберіть "Найкраща версія" і тепер, важливо, позначте два чеки: введіть тут опис зображення

Чеки:
Перезаписування файлів, що записуються, які не перевіряються

Перезапишіть усі файли, навіть якщо локальна версія відповідає вказаній версії


Опишіть, будь ласка, елементи, які потрібно перевірити, а не публікувати скріншот.
Чак Адамс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.