Давайте посмотрим на получившийся репозиторий:
PS> git log --oneline --graph --decorate --all
* 44cd729 (tfs/featureA, featureA) Goodbye
* d202b53 Branched from $/tfvc-test/Trunk
* c403405 (HEAD, tfs/ default, master) Hello
* b75da1a New project
PS> git log -1
commit c403405f4989d73a2c3c119e79021cb2104ce44a
Author: Ben Straub
Date: Fri Aug 1 03:41:59 2014 +0000
Hello
git-tfs-id: [https://username.visualstudio.com/DefaultCollection]$/myproject/Trunk;C16
Видим две локальные ветки — master и featureA — представляющие соответственно основную ветку разработки (Trunk в TFVC) и дочернюю ветку featureA в TFVC. Также вы можете видеть, что "удалённый репозиторий" tfs имеет две ссылки — default и featureA — соответствующие тем же веткам в TFVC. git-tfs также называет ветку с которой вы инициировали копирование tfs/default, имена остальных веток соответствуют таковым в TFVC.
Ещё одна стоящая внимание вещь: строки git-tfs-id: в сообщениях коммитов. git-tfs использует их вместо меток для сопоставления наборов изменений из TFVC и коммитов в Git. Как результат, ваши коммиты будут иметь различные SHA-1 хеши до и после отправки в TFVC.
Рабочий процесс с git-tf[s]
Независимо от того, какой конкретный инструмент для работы с TFVC вы используете, вам следует задать некоторые конфигурационные параметры для избежания проблем.
$git config set --local core.ignorecase=true
$git config set --local core.autocrlf=false
Очевидно, после клонирования проекта вам захочется поработать над ним. Но в TFVC и TFS есть несколько особенностей, осложняющих рабочий процесс:
1. Функциональные ветки (feature branches), не представленные на TFVC сервере добавляют сложности. Всё из-за того, что TFVC имеет совершеннодругую концепцию ветвления, нежели Git.
2. Помните, что TFVC позволяет пользователям запретить изменения файлов другими пользователями. Разумеется, это не помешает вам изменить их в локальном репозитории, но вы не сможете отправить эти изменения на TFVC сервер пока не будет снят запрет.
3. В TFS существует понятие "курируемых" наборов изменений; это означает, что прежде чем изменения будут приняты сервером, они должны успешно пройти фазы сборки и тестирования. При этом используется функциональность "откладывания изменений", не рассматриваемый нами в деталях. Вы можете вручную эмулировать подобное поведение в git-tf, а git-tfs предоставляет специальную команду checkintool, способную работать с "курируемыми" наборами изменений.
Для краткости мы рассмотрим здесь простой сценарий работы, избегающий описанных особенностей.
Предположим, вы проделали некую работу, зафиксировали несколько изменений в ветке master и готовы поделиться результатом. Вот как выглядит Git репозиторий:
$git log --oneline --graph --decorate --all
* 4178a82 (HEAD, master) update code
* 9df2ae3 update readme
* d44b17a (tag: TFS_C35190, origin_tfs/tfs) Goodbye
* 126aa7b (tag: TFS_C35189)
* 8f77431 (tag: TFS_C35178) FIRST
* 0745a25 (tag: TFS_C35177) Created team project folder $/tfvctest via the \
Team Project Creation Wizard
Мы хотим взять слепок на момент коммита 4178a82 и отправить его на TFVC сервер. Но для начала давайте проверим наличие наработок от других членов команды:
$git tf fetch
Username: domain\user
Password:
Connecting to TFS...
Fetching $/myproject at latest changeset: 100%, done.
Downloaded changeset 35320 as commit 8ef06a8. Updated FETCH_HEAD.
$git log --oneline --graph --decorate --all
* 8ef06a8 (tag: TFS_C35320, origin_tfs/tfs) just some text
| * 4178a82 (HEAD, master) update code
| * 9df2ae3 update readme
|/
* d44b17a (tag: TFS_C35190) Goodbye
* 126aa7b (tag: TFS_C35189)
* 8f77431 (tag: TFS_C35178) FIRST
* 0745a25 (tag: TFS_C35177) Created team project folder $/tfvctest via the \
Team Project Creation Wizard
Похоже, вы работаете над проектом не в одиночку. История разошлась. Git очень хорош в таких ситуациях, но в случае TFVC есть два пути:
1. Как пользователь Git, вы, наверняка, заходите создать коммит-слияние (в конце-концов именно так поступает git pull). В git-tf есть специальная команда для этого: git tf pull. Но помните, что TFVC сервер мыслит несколько иначе, и если вы отправите коммит-слияние, ваша история станет выглядеть по-разному со стороны Git и TFVC, что может привести к путанице. Хотя, если вы хотите отправить все изменения одним набором, это самый лёгкий способ.
2. Перенос коммитов сделает историю линейной, а значит мы сможем сопоставить каждому Git-коммиту набор изменений в TFVC. Мы рекомендуем использовать именно этот способ как наиболее гибкий. В git-tf для этого служит команда git tf pull --rebase.
Выбор за вами. Мы же последуем собственным советам:
$git rebase FETCH_HEAD
First, rewinding head to replay your work on top of it...
Applying: update readme
Applying: update code
$git log --oneline --graph --decorate --all
* 5a0e25e (HEAD, master) update code
* 6eb3eb5 update readme
* 8ef06a8 (tag: TFS_C35320, origin_tfs/tfs) just some text
* d44b17a (tag: TFS_C35190) Goodbye
* 126aa7b (tag: TFS_C35189)
Читать дальше