Конвертировать наборы изменений в shelveset

Можно ли создать shelveset из двух версий одной ветки, просто выполнив несколько операций в tfs/tfpt?

например, создать набор полки из (набор изменений 2013 -> набор изменений 2034)

4 ответа

Решение

Нет, это невозможно. Наборы изменений и полки - это разные вещи с разными целями. Возможно, вы могли бы написать плагин, чтобы делать то, что вам нужно (получить ревизию, проверить файлы, отложить файлы).

Из набора изменений можно создать полку с некоторыми ограничениями. Мне нужно было откатить изменение из ветки, чтобы удалить его из релиза, но его не было ни в одной другой ветке, поэтому я хотел сохранить изменение в наборе полок. Я достиг этого, как показано ниже:

  • Откат изменений и проверка отката.
  • Откатить откат изменений. Это дает мне набор ожидающих изменений, содержащих исходное изменение.
  • Отложите отложенные изменения.

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

Это не невозможно Технически говоря, вы можете сделать это, хотя вы можете и не захотеть. Я позволю читателю решить.

Вы можете сделать это в новом рабочем пространстве.

  1. Получите набор изменений (новый код)
  2. Переместить весь источник во временную папку. (не перемещайте папку $ tf). Исходное дерево теперь должно быть пустым.
  3. Получить предыдущий набор изменений.
  4. Зеркально скопируйте новый код поверх старого
  5. Сделать примирение.

Теперь вы можете создать 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), повторно применить изменения из нового коммита и опубликовать его как набор полок:

  1. Посмотри в 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
    
  2. Создайте новую ветвь из коммита, который происходит до того, для которого вы хотите задним числом создать набор полок:

    $ git checkout -b CCCCCCC
    
  3. Извлеките изменения из коммита, для которого вы хотите создать shelveset для:

    $ git checkout BBBBBBB -- .
    
  4. Зафиксируйте эти промежуточные файлы:

    $ git commit -m "Committing stuff for a retroactive shelveset that does X, Y and Z."
    
  5. Создайте полки:

    $ git tfs shelve my_retroactive_shelveset HEAD
    

преимущества

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

  • Поскольку shelveset был создан из ветки в Git, вы можете удалить эту ветку и при этом сохранить историю Git-TFS в чистоте.

Недостатки

  • Это не чистое решение TFS

Каждая фиксация создает набор полок. Таким образом, мы можем найти набор полок, созданный при инициировании фиксации. Это будет иметь точно такие же изменения. Нам не нужно создавать новый набор полок.

Другие вопросы по тегам