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

Posted

技术标签:

【中文标题】TFS:如何撤消批处理文件中未修改文件的签出【英文标题】:TFS: How can you Undo Checkout of Unmodified files in a batch file 【发布时间】:2010-10-07 08:28:18 【问题描述】:

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

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

是否有一个命令(或一系列命令)可以在不提示用户的情况下撤消所有未修改文件的签出?

【问题讨论】:

请注意,当提示更改的文件时,手动撤消所有更改并期望选择“全部否决”将无法正常工作,因为它将撤消ADD无需提示即可更改(请参阅Ray's answer)。 【参考方案1】:

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

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

感谢 Matt Florence 更新链接。

感谢 Ray Vega actual syntax。

【讨论】:

这应该被编辑/合并以包含使用信息作为答案内容的一部分。 你真的很想看这篇文章:aaubry.net/undo-checkout-on-unchanged-files-tfs.html 嗯,几乎每个人每天都会做几次的事情:“让我们把它放在一个名为 Power Tools 的单独安装程序中”... 叹息 @Mike Chaliy 你会想。我现在正在尝试 TFS,并且正在寻找如何做到这一点并最终来到这里。 如果您的更改是合并,则它不起作用。似乎 tfpt uu 总是认为合并是真正的更改,即使没有文件更改,也没有选项可以翻转该行为。可以作为默认行为,但有时这不是您想要的。【参考方案2】:

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

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

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

【讨论】:

这应该是公认的答案,它包含所有相关细节(由较高的分数证明)。 酷。此外,为什么不将此作为永久“外部工具”添加到 Visual Studio。以此为例:blog.kurtschindler.net/post/… 命令:[您的安装目录]\TFPT.EXE 参数:uu 。 /noget /recursive 初始目录:$(SolutionDir) 问题指定在没有提示的情况下执行此操作,但似乎没有一个答案可以解决这个问题。如果您需要这个,附加的 /noprompt 是您正在寻找的选项。 PowerTools 文档缺少这个!它列出了一些命令的此选项,但没有列出这个 (UU)。当心! @user20358 cd 到您的工作区目录所在的位置(例如,我的是 c:\myProject)或在 uu 之后明确包含它(用它替换句点 .)跨度> 这是否有强制开关,例如 /Y 或 /force?我总是被问到是否真的想撤消它,我想让它自动化。把 /Y 放在那里,但它告诉我选项 Y 需要一个值。【参考方案3】:

谢谢@mike 和@ray,

我希望让它变得更容易。

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

点击添加。

输入标题。

命令:tfpt.exe

参数:uu 。 /noget /递归

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

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

在需要时使用它们。

享受,

办公室

【讨论】:

非常酷。您也可以更进一步并添加快捷方式。请注意您添加的命令有多远(例如,它可能是第四个)。然后到工具 -> 选项 -> 环境 -> 键盘 -> 并输入“显示包含的命令”文本框“Tools.External”并分配一个快捷方式。例如,我选择了 Tools.ExternalCommand4,因为我新添加的撤消命令是第四个。然后我分配了快捷键Ctrl + Alt + U,Ctrl + Alt + U 我们能提供一个更新版本吗?如果找到 tf.exe 但什么是 uu 命令?它告诉我无法识别的命令:uu。感谢您的帮助 @Shay :在 VS2015 中为我工作,安装了最新的 TFS 电动工具。【参考方案4】:
    右键单击您的项目 选择撤消结帐,然后单击确定,或者留下任何确认... 然后,在撤消签出时,对于其中有真正更改的每个文件,系统会提示您确认签出该文件...只需单击“全部拒绝”

Visual Studio 会知道签出的文件是否有更改。

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

【讨论】:

Be aware that this method also removes added files that are not yet checked in from TFS. ...是的,这是一个非常直接的取消资格。 它适用于我的 Baseless 分支合并。谢谢。通常在这种情况下,VS 将解决方案中的所有文件标记为已更改。 当 nuget 签出 10000 个不需要更新的文件时,这简直是地狱。【参考方案5】:

仅在使用 TFS2017VS2017/VS2019 时使用答案更新了此问题。

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

Visual Studio 2017/2019 扩展

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

extension for VS2017

extension for VS2019

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

已知错误

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

Windows Shell 集成扩展

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

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

【讨论】:

我在问题中注意到,他们想编写脚本,因为我没有解决方案,恐怕 安装链接扩展后在VS2017中找不到“Undo Unchanged”选项。我错过了什么吗? 我没怎么用过。当我使用它为我的客户测试它时,我必须在 Team Explorer 中单击一下,并确保有要撤消的更改。它可能仅在您只有等待更改排队等待此选项出现时才会出现。 (或仅更改一个分支)... @Erzékiel 该选项仅在解决方案资源管理器打开并准备就绪时出现。 此扩展有时有效,它的存在与打开 TFS 源代码管理资源管理器而不是解决方案资源管理器有关(正如一些错误地指出的那样) - 不要混淆两个不同的控制窗口。然而;当我有时说,因为它来了又去。现在我没有,一个月前我有。它有点问题,我担心其他扩展是罪魁祸首,比如 Resharper 等。【参考方案6】:

如果您只是简单地将所有已签出的文件重新签入,TFS 足够聪明,可以找出哪些文件发生了变化,并且只将它们包含在服务器上记录的变更集中。

TFS 通过比较签入前后文件内容的 MD5 哈希值来做到这一点。

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

如果您的进程可能需要删除文件,最好的办法可能是查看 Team Foundation Power Tools 命令 (tfpt) 并使用 tfpt online 命令,该命令只会检查已更改的文件,并且将足够聪明地为不再需要或更改名称的任何文件挂起删除并挂起添加。

祝你好运,

马丁。

【讨论】:

感谢您的支持,但我们当时不想签入修改后的文件。在功能完成之前不应签入已修改的内容,但应删除未修改的内容,以便开发人员可以查看更改。 @RobertWagner 如果您有一个封闭的构建,那么当您收到必须先构建更改的弹出警报时,您可以取消(如果它没有在检测到相同的文件时中止)。跨度> 【参考方案7】:

请注意,TFS 撤消不会恢复文件系统的“修改日期”值。这非常令人沮丧,尤其是如果您使用 robocopy 之类的工具来同步远程机器。即使在您撤消签出后,如果您保存了文件从而更新了“修改日期”值,那么即使在撤消签出之后,更新的值也会保留。

【讨论】:

使用 robocopy 或 VCS,使用混合总是会导致不一致。直接从 VCS 填充每台机器会更好。【参考方案8】:

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

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

用法:tfpt uu [/changeset:changesetnum] [/recursive] [/noget] [文件规范...]

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

/changeset 选项不能与文件规范或 /recursive 一起使用。

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

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

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

它依赖于工作目录。 它不会处理整个工作区。

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

tfpt uu /noget

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

【讨论】:

【参考方案9】:

我可以在上面看到 Ray LionFang 的方法。由于我没有代表,因此无法在那里发表评论。虽然我喜欢这种方法,因为不需要对工具等进行任何更改......

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

.......这种方法存在一个问题,即点击“No To All”会保留一些未修改的文件。它似乎做了类似撤消未修改文件的操作,直到它遇到实际修改的第一个文件,然后忽略其余未修改的文件,如果这有任何意义的话。这种效果我只见过一次。

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

【讨论】:

请注意,这一点怎么强调都不过分。使用这种方法也可以删除新添加到项目中的文件。其他答案中也提到了这一点。【参考方案10】:

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

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

【讨论】:

我们可以签出单个文件,锁定它不会让开发人员签入。 本来要投反对票的,但是“在工作中,我们都讨厌 TFS。”保存它。

以上是关于TFS:如何撤消批处理文件中未修改文件的签出的主要内容,如果未能解决你的问题,请参考以下文章

如何删除从 TFS 中删除的成员完成的锁定

TFS如何强制撤销别人的机器签出的文件

TFS命令tf:undo(强制签入别人签出的文件)(转)

使用cmd进行tfs的签入

如何撤消 TFS 中的回滚?

如何检索分支上元素的结帐评论?