Синхронизируйте TFS и GIT

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

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

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


person magol    schedule 21.11.2013    source источник


Ответы (2)


Невозможно синхронизировать 2 репозитория, развивающихся отдельно, на 100% автоматически с любым выбранным вами решением (для достижения автоматической синхронизации вы должны либо выполнить синхронизацию в кратчайшие сроки, либо иметь возможность блокировать push в 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

При этом каждый раз, когда кто-то нажимает на репозиторий git, коммиты будут регистрироваться в 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-tfs... и что-то, что я не рекомендую делать.
  • Я настоятельно рекомендую пойти тем же путем, что и Microsoft, и перенести все на git (даже оставаясь на сервере TFS или VSTS, если это необходимо), таким образом синхронизация будет намного проще (даже если не на 100% автоматическая ;-)). Я сделал хороший документ о том, как перейти с TFVC: https://github.com/git-tfs/git-tfs/blob/master/doc/usecases/migrate_tfs_to_git.md
  • Постарайтесь убедить свое предприятие, что каждая команда должна выбирать и осваивать свои инструменты, а не навязывать какой-то выбор.
person Philippe    schedule 22.11.2013
comment
Внешние стороны будут создавать ветки в репозитории GIT. Если я вас правильно понял, решить не возможно. Вторая проблема, которую я вижу, заключается в том, что репозиторий GIT не сможет получить доступ к нашему серверу TFS, поскольку он находится внутри интрасети. Я хочу, чтобы все инициировалось и координировалось с сервера TFS. - person magol; 22.11.2013
comment
Можем ли мы решить эту проблему каким-либо другим способом, который работает лучше для нас? - person magol; 22.11.2013
comment
Нет, с TFS нет решения того, о чем вы спрашиваете. Ваше единственное решение — перейти от TFSVC (используйте репозиторий git, если у вас есть TFS2013 или провайдер репозитория git) и синхронизировать ваши 2 репозитория git. Других решений нет... - person Philippe; 22.11.2013

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

Таким образом, разумным подходом будет:

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

И в любое время; из основного репозитория coderepo вы можете обновить эти подмодули с помощью:

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

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

Кроме того, учитывая предыдущий вопрос l--''''''---------'''''''''''' , это помогло бы с одним репозиторием со слишком большим количеством файлов.
Хотя для этого скоро появится GVFS.


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

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

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

person VonC    schedule 18.12.2017
comment
большое спасибо за этот подробный ответ. в настоящее время мы используем tfs 2013. да, я считаю, что у нас есть возможность создать командный проект для GIT, но наше ограничение заключается в том, что мы не можем использовать GIT, нам нужно использовать TFS (с TFS, а не с GIT). .. однако лично я хочу иметь возможность использовать GIT для своих собственных изменений, у меня было бы несколько наборов изменений в GIT, затем я бы объединил их в один, а затем преобразовал этот набор изменений в традиционный набор изменений TFS и проверил это, Таким образом, у меня есть только 1 регистрация для каждого элемента TFS, делает snese? - person Alex Gordon; 18.12.2017
comment
@l--''''''---------''''''''''''' Я все еще редактировал свой ответ. Да, я видел ваш предыдущий вопрос и TFS 2013. Я отредактировал свой ответ. - person VonC; 18.12.2017
comment
Чтобы устранить неоднозначность: TFS != TFVC. TFS — это локальный продукт инструментов разработчика (локальная версия VSTS). TFVC — это название созданной там централизованной системы контроля версий. Трудно разобрать вопросы, в которых TFS означает и то, и другое. - person Edward Thomson; 21.12.2017
comment
@ЭдвардТомсон Спасибо. Ссылка, которую я упоминаю (docs.microsoft.com/en-us/vsts/git /обзор) предназначен только для TFS/VSTS, верно? Не ТФВК. - person VonC; 21.12.2017
comment
Верно, это для Git в TFS/VSTS. Я в основном смотрел на комментарий l--''''''---------'''''''''''' , мне было особенно трудно разобрать, что нам нужно используйте TFS (с TFS, а не с GIT). Я предполагаю, что один из этих TFS означает систему контроля версий (TFVC), а другой — платформу (TFS), но я немного запутался. - person Edward Thomson; 21.12.2017
comment
(Я изо всех сил стараюсь подавить свою педантичность по этому поводу, но считаю невозможным не жаловаться, когда не могу легко разобрать смысл.) - person Edward Thomson; 21.12.2017
comment
@EdwardThomson Я ценю вашу педантичность;) Это напоминает мне о Джоне Ските (codeblog.jonskeet.uk/2005/12/30/pedantry-how-much-is-too-much) - person VonC; 21.12.2017
comment
@EdwardThomson Забавно, я часто так делаю и сегодня тоже. А еще я использую git-tfs и TFS(Git) ;-) - person Philippe; 21.12.2017