Конвертировать наборы изменений в shelveset
Можно ли создать shelveset из двух версий одной ветки, просто выполнив несколько операций в tfs/tfpt?
например, создать набор полки из (набор изменений 2013 -> набор изменений 2034)
4 ответа
Нет, это невозможно. Наборы изменений и полки - это разные вещи с разными целями. Возможно, вы могли бы написать плагин, чтобы делать то, что вам нужно (получить ревизию, проверить файлы, отложить файлы).
Из набора изменений можно создать полку с некоторыми ограничениями. Мне нужно было откатить изменение из ветки, чтобы удалить его из релиза, но его не было ни в одной другой ветке, поэтому я хотел сохранить изменение в наборе полок. Я достиг этого, как показано ниже:
- Откат изменений и проверка отката.
- Откатить откат изменений. Это дает мне набор ожидающих изменений, содержащих исходное изменение.
- Отложите отложенные изменения.
Вы можете применить эту технику к случаю, описанному в вопросе, но это потребует больших ручных усилий, поскольку его придется повторять для каждого набора изменений. Это также приведет к большому беспорядку в TFS, так как вам также придется проверять откаты откатов.
Это не невозможно Технически говоря, вы можете сделать это, хотя вы можете и не захотеть. Я позволю читателю решить.
Вы можете сделать это в новом рабочем пространстве.
- Получите набор изменений (новый код)
- Переместить весь источник во временную папку. (не перемещайте папку $ tf). Исходное дерево теперь должно быть пустым.
- Получить предыдущий набор изменений.
- Зеркально скопируйте новый код поверх старого
- Сделать примирение.
Теперь вы можете создать Shelveset.
Если вам удастся сфокусироваться на определенной папке, она пойдет быстрее, и вы сможете автоматизировать ее. Вот пример командной строки, которая сделает это. Я только что попробовал, и это сработало для меня.
В этом примере я указываю на папку из корня с именем "Src". Измените свою корневую папку.
md tmpws
cd tmpws
tf vc workspace /new /noprompt tmpws /location:local /permission:private
tf vc get "$/Src" /version:C2222 /recursive /noprompt
cd ..
md tmp
move "tmpws\Src" tmp
cd tmpws
tf vc get "$/Src" /version:C1111 /recursive /noprompt /force /overwrite
cd ..
robocopy "tmp\Src" "tmpws\Src" /mir
tf vc reconcile /promote /adds /deletes /diff /recursive /noprompt
tf vc shelve /replace /noprompt mychange
tf vc undo "$/Src" /recursive /noprompt
tf vc workspace /delete tmpws
cd ..
rmdir /q /s tmp
rmdir /q /s tmpws
В то время как это решение не включает в себя чисто решение TFS, оно не включает в себя использование истории изменений TFS, как это делает ответ Ли Ричардсона.
Вы можете использовать Git-TFS, чтобы клонировать репозиторий или ветку TFS, затем создать новую ветку из предыдущего коммита (регистрация TFS), повторно применить изменения из нового коммита и опубликовать его как набор полок:
Посмотри в
git log
для коммита перед тем, для которого вы хотите создать набор изменений:$ git log --oneline AAAAAAA Newest commit BBBBBBB The commit for which I want a shelveset CCCCCCC The commit where I will create a new branch from
Создайте новую ветвь из коммита, который происходит до того, для которого вы хотите задним числом создать набор полок:
$ git checkout -b CCCCCCC
Извлеките изменения из коммита, для которого вы хотите создать shelveset для:
$ git checkout BBBBBBB -- .
Зафиксируйте эти промежуточные файлы:
$ git commit -m "Committing stuff for a retroactive shelveset that does X, Y and Z."
Создайте полки:
$ git tfs shelve my_retroactive_shelveset HEAD
преимущества
Это обеспечивает чистоту истории наборов изменений TFS без необходимости отмены набора изменений, создания набора полок для отмены возврата ранее отмененного набора изменений.
Поскольку shelveset был создан из ветки в Git, вы можете удалить эту ветку и при этом сохранить историю Git-TFS в чистоте.
Недостатки
- Это не чистое решение TFS
Каждая фиксация создает набор полок. Таким образом, мы можем найти набор полок, созданный при инициировании фиксации. Это будет иметь точно такие же изменения. Нам не нужно создавать новый набор полок.