1

假设我将解决方案-A,变更集 10 分支到解决方案-B。

后来,我意识到解决方案 B 中不应该有变更集 7。

有没有办法只从解决方案 B 回滚变更集 7 而不会损害解决方案 A?

每当我使用 tf rollback 时,所有未决的更改都会转到解决方案-A。

提前致谢 !

4

4 回答 4

2

我知道这是一个老问题,但这可能会帮助任何有同样问题的人。特别是当您需要回滚一个变更集时,该变更集很久以前已在另一个分支上签入。

在以下批处理文件中更新 WORKSPACE_ROOT 和 TFS_BRANCH_ROOT。将其命名为例如 RollbackMigrate.cmd 并始终从工作区根目录运行它。

该批处理文件将:

  1. 解析参数 - 只有一个参数是变更集编号
  2. 在 TFS 上查找当前工作空间的名称及其路径
  3. 查找迁移的 TFS 源路径
  4. 将源映射到当前工作区
  5. 回滚变更集
  6. 创建搁置集并撤消签出
  7. 删除临时映射
  8. 取消搁置先前创建的搁置集并迁移它
    • 您只需要在新窗口中自动合并搁置集
  9. 删除临时搁置集
  10. 报到
    • 您只需要更新评论、注释和工作项链接

@echo off
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

set WORKSPACE_ROOT=D:\PathToMyWorkspaces
set TFS_BRANCH_ROOT=$/Project/Branches

:01_ARGUMENT_PARSING
echo Rollback changes from another branch
if [%1]==[] (
    set /P CHANGESET=Enter changeset number: 
    if [!CHANGESET!]==[] (
        echo Changeset number is required! Exiting!
        exit /B 1
    )
) else (
    set CHANGESET=%1
    shift
)
set SHELVE_NAME="Auto shelved rollback of %CHANGESET%"

:02_FIND_MY_WORKSPACE_NAME
for %%i in (.) do (
    set WORKSPACE=%%~nxi
)
if not [%CD%]==[%WORKSPACE_ROOT%\%WORKSPACE%] (
    echo This script works only in the root of workspace e.g. D:\PathToMyWorkspaces\MyWorkspace
    exit /B 1
)
echo Current workspace is %WORKSPACE%
for /f %%i in ('tf workspaces %WORKSPACE% /noprompt /format:detailed ^| grep -om 1 "$/[^:]\+"') do (
    if not [%DST%]==[] (
        echo Cannot work on workspaces with more mappings! Exiting!
        exit /B 2
    )
    set DST=%%i
    echo Found destination path for migration: "%%i"
)

:03_VIEW_CHANGESET
for /f %%i in ('tf changeset 1570888 ^| grep -om 1 "%TFS_BRANCH_ROOT%/[^/]\+/[^/]\+"') do (
    set SRC=%%i
    echo Found source path for migration: "%%i"
)
if [%SRC%]==[] (
    echo Cannot find path to source branch! Exiting!
    exit /B 3
)
for %%i in (%SRC%) do (
    set SRC_BRANCH=%%~nxi
)

:04_MAP_SOURCE
set TMP_SRC_PATH=%WORKSPACE_ROOT%\%WORKSPACE%_%SRC_BRANCH%
echo Create temporary mapping for source branch in %TMP_SRC_PATH%
mkdir %TMP_SRC_PATH%
echo Creating mapping for "%SRC%" to "%TMP_SRC_PATH%"
tf workfold /map %SRC% %TMP_SRC_PATH%
if %errorlevel% NEQ 0 (
    echo Can't create mapping for "%SRC%", exiting!
    exit /B 4
)

:05_ROLLBACK_CHANGESET
echo Performing rollback of changeset %CHANGESET%
tf rollback /changeset:%CHANGESET% /lock:checkin /keepmergehistory

:06_SHELVE_ROLLBACK
echo Shelving rollback
tf shelve /comment:%SHELVE_NAME% %SHELVE_NAME% /noprompt /move /replace

:07_UNMAP_AND_DELETE_TEMPORARY
echo Unmapping "%SRC%" from "%TMP_SRC_PATH%"
tf workfold /unmap "%TMP_SRC_PATH%"
echo Deleting "%TMP_SRC_PATH%"
rmdir /S /Q "%TMP_SRC_PATH%"

:08_UNSHELVE_MIGRATE
echo Unshelving the rollback...
tfpt unshelve /migrate /source:"%SRC%" /target:"%DST%" %SHELVE_NAME% /noprompt

:09_DELETE_THE_SHELVESET
echo Deleting the shelveset
tf shelve /delete %SHELVE_NAME% /noprompt

:10_CHECKIN
echo Checking in the rollback...
tf checkin
于 2016-01-29T20:31:05.947 回答
1

您必须回滚已合并到解决方案 b 的变更集,然后重新应用没有变更集 7 的合并。

于 2011-02-05T06:43:23.723 回答
0

我建议使用电动工具包附带的 TFPT.exe:http: //visualstudiogallery.msdn.microsoft.com/c255a1e4-04ba-4f68-8f4e-cd473d6b971f/

高级概述:

  1. 从解决方案-B 的工作区映射回滚变更集
  2. 提交解决方案-B 中工作区映射的更改

命令:

  1. c:\workspace\mapping\to\solution\b> tfpt rollback /changeset:7
  2. c:\workspace\mapping\to\solution\b> tf commit
于 2011-02-05T07:06:39.270 回答
0

最后我做了类似下面的事情。

  1. 在解决方案 A 上回滚变更集 7 并签入。这将在解决方案-A 上创建变更集 11
  2. 将变更集 11 合并到解决方案-B 分支
  3. 在解决方案-A 分支上回滚更改 11 并签入,这将在解决方案-A 上创建更改集 12

将来从解决方案 A 合并到解决方案 B 跳过合并变更集 12。

于 2014-01-14T08:42:24.990 回答