TFS:如何撤消批处理文件中未修改文件的签出

问题描述 投票:167回答:10

我们使用批处理文件生成代码,它会自动从Team Foundation Server(TFS)中检出生成的文件,以便它可以重新生成它们。这些文件中的大多数都没有被修改,但生成器并不提前知道。

“tfs undo”命令撤消签出,但会提示是否已修改某些(我们不想这样做)。我们也不想立即签入生成的文件。

是否有命令(或一系列命令)撤消所有未修改文件的检出而不提示用户?

tfs version-control tfvc
10个回答
199
投票

看看Team Foundation Server Power Tools August 2011的Undo Unchanged命令

c:\myProject> tfpt uu . /noget /recursive

感谢Matt Florence的链接更新。

感谢Ray Vega为actual syntax


-20
投票

据我所知,在TFS中,如果您签出一个团队项目,整个项目将被检出,而您无法控制哪些文件被删除。如果要阻止签入某些文件,可以锁定它们。

在工作中,我们都讨厌TFS。


124
投票

安装Team Foundation Server Power Tools并使用项目工作空间目录根目录下的tfpt.exe从命令行运行以下命令:

c:\myProject> tfpt uu . /noget /recursive

强烈建议包括/noget,因为它可以防止强制“获取最新”的所有项目文件,这取决于总数可能需要很长时间。


118
投票

谢谢@mike&@ray,

我希望让它变得更容易。

在VS的“工具”菜单中,单击“外部工具”。

单击添加。

输入标题。

命令:tfpt.exe

论点:uu。 / something / recursive

初始目录:[您可以从箭头按钮中选择]。

“工具”菜单中添加了两个新命令。

需要时使用它们。

请享用,

奥菲尔


26
投票
  1. 右键单击您的项目
  2. 选择撤消结帐,然后只需单击“确定”,或者剩下的任何确认...
  3. 然后,在撤消checkout时,对于每个在其中有REAL更改的文件,提示将要求您确认该文件的签出...只需单击“No to All”

Visual Studio将知道签出的文件是否有更改或没有。

警告:此方法还会删除新文件,即尚未签入TFS的文件。如果要保留这些文件,只需将它们从“撤消”文件集中排除即可。


8
投票

如果您只是再次检查已签出的所有文件,TFS足够聪明,可以找出哪些更改,并且只将它们包含在服务器上记录的变更集中。

TFS通过比较签入前后文件内容的MD5哈希来完成此操作。

这都假设您的生成过程纯粹更新了同一组文件,即您永远不会遇到下一代不需要上一代生成的文件的情况(即您希望删除删除)对于该文件)或文件更改名称。

如果您的进程可能需要删除文件,那么您最好的选择是查看Team Foundation Power Tools命令(tfpt)并使用tfpt online命令,该命令仅检查已更改的文件,并且将足够智能地删除删除任何不再需要的文件或更改的名称和挂起添加。

祝好运,

马丁。


8
投票

仅在使用TFS2017和VS2017 / VS2019时更新了此问题并给出了答案。

TFS 2017不存在电动工具,旧的电动工具不能很好地与它一起工作,但显然大多数功能已经转移到VS2017本身或插件(见下文)。

Visual Studio 2017/2019扩展

撤消未更改文件等一些操作已移至

extension for VS2017

extension for VS2019

“撤消未更改”按钮位置:

Known bug

您必须打开“源代码管理资源管理器”(并将其保持打开状态),以便在“待更改”视图的“操作”菜单中显示“撤消未更改”。 reported here

Windows Shell集成扩展

此外,您仍然可以通过separate installer设置Windows shell集成,该tfpt uu /?不再链接到TFS Power Tools。

Windows shell集成与之前的powertools完全不同,但最重要的操作对我有用。


5
投票

请注意,TFS撤消不会还原文件系统的“修改日期”值。这非常令人沮丧,特别是如果您使用robocopy等工具来同步远程计算机。即使在撤消签出后,如果您保存了文件,从而更新了“修改日期”值,则即使在撤消签出后,该更新的值也会保留。


4
投票

关于tfpt的uu选项(在大多数其他答案中推荐),有几点我最初并不清楚。首先,这是可以使用命令tfpt uu . /noget /recursive 访问的命令行帮助

撤消冗余挂起的更改。如果具有挂起更改的项目的状态与服务器上的状态相同,则撤消更改。

用法:tfpt uu [/ changeset:changesetnum] [/ recursive] [/ noget] [filespec ...]

  • / changeset将工作空间与指定的变更集版本的项目状态进行比较,而不是最新版本
  • filespec ...仅检查列出的文件规范是否有冗余更改
  • / recursive使用完全递归检查指定的filespecs
  • / noget在检查之前不要运行get

/ changeset选项不能与filespecs或/ recursive一起使用。

现在让我分解其他答案中推荐的命令。

tfpt uu
  • .指定我们希望使用'Undo Unchanged'命令。
  • /noget表示(我猜)当前工作目录应该用作filespec。
  • /recursive确保在撤消未更改的文件之前不会调用“获取最新版本”。
  • tfpt uu /noget确保不仅会考虑filespec,还会考虑所有递归子文件夹和文件。这似乎取决于filespec - 如果没有提供,则处理整个工作区。

关于上面的命令,这里有几点需要注意......

  • 它取决于工作目录。
  • 它不处理整个工作区。

我发现以下命令最适合我 - 它将处理整个工作区。

qazxswpoi

请注意,它仍然依赖于工作目录,因为tfpt使用它来确定应该处理哪个工作空间。但只要您提供工作区内文件或文件夹的路径,就可以了。


3
投票

我可以看到Ray LionFang的方法。由于我没有代表,所以无法评论。虽然我喜欢这种方法,因为工具等没有必要改变........

  1. 右键单击您的项目
  2. 选择撤消结帐,然后只需单击“确定”,或者剩下的任何确认...
  3. 然后,在撤消结帐时,对于每个包含REAL更改的文件,提示将要求您确认该文件的签出...只需单击“否全部”
  4. Visual Studio将知道签出的文件是否有更改或没有。请注意,此方法还会删除尚未从TFS签入的添加文件...

.......这种方法存在一个问题,因为点击“No To All”会保留一些未修改的文件。它似乎做了一些事情,比如撤消未经修改的文件,直到它击中实际修改的第一个文件,然后忽略其余的未修改文件,如果这有意义的话。我偶尔只见过这种效果。

一个潜在的解决方法是遵循上述过程,但不是点击“No To All”,而是为每个文件点击“No”。由于这可能需要一段时间,具体取决于您正在使用的文件数量,我通常做的是按住“ALT + N”,它只是加速所有文件,同时撤消所有未修改的文件。

© www.soinside.com 2019 - 2024. All rights reserved.