2013-11-21 4 views
16

Сегодня у нас есть весь наш исходный код на нашем локальном сервере TFS. Теперь мы хотим, чтобы некоторые внешние стороны могли получить доступ к части кода. Поэтому мы рассматриваем возможность того, что, например, Скопируйте этот код на внешний сервер GIT, к которому они могут получить доступ.Синхронизация TFS и GIT

Я рассмотрел git-tfs. Но если я правильно понимаю, вам нужно вручную синхронизировать GIT и TFS, когда это произошло с изменениями на любом из них. Есть ли способ иметь клон кода, который автоматически синхронизируется.

Если в TFS есть изменения, он автоматически синхронизируется с GIT и наоборот. Не должно быть никакой неопределенности, если я буду работать с самым текущим кодом

ответ

10

Невозможно синхронизировать 2 репозитория, раздельно автоматизировавшись на 100% с любым решением, которое вы выберете (для достижения автоматической синхронизации вы должны либо выполнить синхронизацию в кратчайшие сроки или возможность блокировать нажатие на git или зарегистрироваться в TFVC, когда одна из 2 команд начнет синхронизацию).

Итак, у вас всегда будут конфликты, которые вы должны объединить вручную. Вы можете найти рабочий процесс, который предотвратит большинство из них, но никогда не решит все случаи, и эти оставшиеся случаи будут очень трудно решить ...

В любом случае, вы могли бы почти достичь того, чего хотите (это зависит от ваших ожиданий: вам нужна поддержка ветвления --hard -, ...) с git-tfs (я включил в git-tfs все необходимое для этого, но никогда не использовался в производстве), но это немного сложно.

Вам необходимо клонировать репозиторий TFS в bare хранилище:

git tfs clone https://server/tfs/TeamCollection $/project/trunk --bare --with-branches

, то вам необходимо написать в вашем post-receive крючке этого bare того хранилища подобного (я не помню, если он работает) :

branch=$(git rev-parse --symbolic --abbrev-ref $1) 
if [ "master" == "$branch" ]; then 
    branch="default" 
fi 
git tfs rcheckin --bare -i $branch 

при том, что каждый раз, когда кто-то толчок в репозиторий, коммиты будут проверены в в TFS.

Для большего комфорта (в противном случае они всегда будут иметь скучные конфликты для решения, когда они попытаются нажать), вы можете синхронизировать репозиторий git с сервером TFS с запланированной задачей с помощью команды (таким образом, они будут знать о новых коммитах раньше):

git tfs fetch --all 

Примечание: Я не помню, если эта команда может быть использована в bare хранилище (теперь, когда я думаю об этом, я не думаю так). В противном случае вам придется использовать вместо этого git tfs fetch -b=myGitBranch -i tfsRemote для каждой существующей ветки :(

Но я уверен, что они никогда не смогут работать с ветвями, которые еще не были созданы в tfs :(Инструмент git-tfs действительно не способен чтобы автоматически создавать ветку TFVC из истории git. Технически это возможно, но я не думаю, но никогда не разрабатывался (потому что git-tfs - это больше, чем инструмент, чтобы убежать от TFVC, чем инструмент для проверки вашего развития в нем ...)

И некоторые другие вещи могут быть трудными или невозможными ...

Надеюсь, это поможет.

PS:

  • это тяжелая работа, вы пытаетесь сделать для кого-то не используется для GIT-ТПО ... и что-то я не рекомендую делать.
  • Я настоятельно рекомендую идти тем же путем, что и Microsoft, и переносить все на git (даже если он находится на сервере TFS или VSTS, если это необходимо), таким образом синхронизация будет намного проще (даже если она не 100% автоматическая;)). Я сделал хороший документ о том, как перейти от TFVC: https://github.com/git-tfs/git-tfs/blob/master/doc/usecases/migrate_tfs_to_git.md
  • Попробуйте убедить ваше предприятие, что каждая команда должна выбирать и осваивать свои инструменты, а не накладывать некоторые варианты.
+1

Внешние стороны будут создавать филиалы в репозитории GIT. Если я правильно вас понимаю, это невозможно решить.Проблема, которую я вижу, заключается в том, что репозиторий GIT не сможет получить доступ к нашему серверу TFS, поскольку он находится внутри интрасети. Я хочу, чтобы все инициировалось и координировалось с сервера TFS. – magol

+0

Можно ли по-другому решить проблему, которая работает лучше для нас? – magol

+0

Нет, с TFS нет решения с тем, что вы просите. Единственное решение - перейти от TFSVC (использовать репозиторий git, если у вас есть TFS2013 или поставщик репозитория git) и синхронизировать репозитории 2 git. Никаких других решений ... – Philippe

3

Главное изменение, с которого был задан этот вопрос (в четвертом квартале 2013 года), заключается в том, что TFS 2015/2017 теперь имеет официальную поддержку хранилищ Git. См. «Git and TFS».

Так разумный подход будет заключаться в следующем:

  • использовать инструмент, как git-tfs экспортировать существующую историю проекта TFS в новое хранилище Git.
  • дроблении, что Git репо в одну главную кодовую, и несколько более мелких сделок РЕПО, каждый из которых представляет часть, которую вы хотите, чтобы другие участники, чтобы получить доступ к
  • ссылкой те sub-repos as submodules в главном кодовую
  • наконец, создавать проекты TFS (на этот раз с использованием Git repos), чтобы отбросить эти репозитории на сервер TFS.

Это предоставит вам коллекцию проектов TFS, каждая из которых может быть открыта для конкретной команды, гарантируя, что только некоторые детали станут видимыми/доступными для других участников.

И в любое время; от главного coderepo репо, вы можете update those submodules with:

git submodule update --recursive --remote --rebase 

(а затем тест, добавить, фиксации и нажмите: ваш главный Git репо будет ссылаться на последние события из этих подмодулей)

Plus, учитывая l--''''''---------'''''''''''' ' s previous question, что помогло бы с одним репо с большим количеством файлов.
Хотя, для этого, there will be soon(ish) GVFS.


Альтернативный подход упоминается l--''''''---------'''''''''''' является:

Я лично хочу, чтобы иметь возможность использовать GIT для моих собственных изменений, я бы несколько ревизий в GIT, то я бы объединить их в один, и затем преобразовать эту ревизию в традиционное TFS ревизию и проверить , что, таким образом, я просто один чек в за TFS пункт

Это возможно, если вы не возражаете потерять промежуточную историю Git-фиксации, когда вы будете агрегировать их в один набор изменений TFS.

+0

Большое спасибо за этот тщательный ответ. в настоящее время мы используем tfs 2013. да, я считаю, что у нас есть возможность создать командный проект для GIT, но наше ограничение состоит в том, что мы не можем использовать GIT, нам нужно использовать TFS (с TFS, а не с GIT). .. однако, я лично хочу, чтобы иметь возможность использовать GIT для своих собственных изменений, у меня было бы несколько наборов изменений в GIT, тогда я бы объединил их в один, а затем преобразовал этот набор изменений в традиционный набор изменений TFS и checjk, таким образом у меня только 1 регистрация на элемент TFS, делает snese? –

+0

@l - '' '' '' '' '' 'Я все еще редактировал свой ответ. Да, я видел ваш предыдущий вопрос и TFS 2013. Я отредактировал свой ответ. – VonC

+0

Чтобы устранить неоднозначность: TFS! = TFVC. TFS - это локальный продукт инструментов разработчика (локальная версия VSTS). TFVC - это название централизованной системы контроля версий, которая возникла там. Трудно разобрать вопросы, которые используют «TFS», чтобы означать и то, и другое. –

Смежные вопросы