ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

请注意,在提示更改的文件时手动撤消所有更改并期望选择“全部否”将无法正常工作,因为它会在没有提示的情况下撤消 ADD 更改(请参阅 Ray's answer )。

C
Community

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

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

感谢马特佛罗伦萨的链接更新。

感谢 Ray Vega actual syntax


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

安装 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 需要一个值。
O
Ofir

谢谢@mike 和@ray,

我想让它变得更容易。

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

https://i.stack.imgur.com/UVJVF.jpg

单击添加。

输入标题。

命令:tfpt.exe

参数:uu 。 /noget /递归

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

https://i.stack.imgur.com/okGud.jpg

https://i.stack.imgur.com/HjZXJ.jpg

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

需要时使用它们。

享受,

奥菲尔


很酷。您也可以更进一步并添加快捷方式。注意你添加的命令有多远(例如它可能是第四个)。然后到工具 -> 选项 -> 环境 -> 键盘 -> 并输入“显示包含的命令”文本框“Tools.External”并分配一个快捷方式。例如,我选择了 Tools.ExternalCommand4,因为我新添加的撤消命令是第四个。然后我分配了快捷键 Ctrl + Alt + U,Ctrl + Alt + U
我们可以请这个更新版本吗?如果找到 tf.exe 但什么是 uu 命令?它告诉我无法识别的命令:uu。感谢帮助
@Shay:在 VS2015 中为我工作,安装了最新的 TFS 电动工具。
M
Michael Richardson

右键单击您的项目选择撤消签出,然后只需单击确定,或者留下任何确认...然后,在撤消签出时,对于其中有真正更改的每个文件,都会提示您确认签出该文件...只需单击“全部拒绝”

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

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


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

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

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

Visual Studio 2017/2019 扩展

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

extension for VS2017

extension for VS2019

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

https://i.stack.imgur.com/wqYDr.png

已知错误

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

Windows Shell 集成扩展

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

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


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

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

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

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

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

祝你好运,

马丁。


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

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


使用 robocopy 或 VCS,使用混合总是会产生不一致的情况。更好的是直接从 VCS 填充每台机器。
S
Scott Munro

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

撤消多余的挂起更改。如果具有未决更改的项目的状态与服务器上的状态相同,则撤消更改。用法:tfpt uu [/changeset:changesetnum] [/recursive] [/noget] [filespec...] /changeset 将工作区与指定的变更集版本而不是最新版本的文件规范的项目状态进行比较...仅检查列出的冗余更改的文件规范 /recursive 使用完全递归检查指定的文件规范 /noget 在检查之前不要运行 get /changeset 选项不能与 filespecs 或 /recursive 一起使用。

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

tfpt uu . /noget /recursive

tfpt uu 指定我们希望使用“撤消未更改”命令。

.表示(我猜)当前工作目录应该用作文件规范。

/noget 确保在撤消未更改的文件之前不调用“获取最新版本”。

/recursive 确保不仅考虑文件规范,而且考虑所有递归子文件夹和文件。这似乎取决于文件规范 - 如果没有提供,则处理整个工作区。

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

它依赖于工作目录。

它不会处理整个工作区。

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

tfpt uu /noget

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


A
Ash

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

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

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

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


请注意,因为这一点怎么强调都不过分。使用这种方法也可以删除新添加到项目中的文件。这在其他几个答案中也提到了。
a
achinda99

据我了解,在 TFS 中,如果您签出团队项目,则会签出整个项目,并且您无法控制哪些文件被关闭。如果您想阻止签入某些文件,您可以锁定它们。

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


我们可以签出单个文件,并且锁定它不会允许开发人员签入它们。
打算投反对票,但“在工作中,我们都讨厌 TFS。”保存了它。