我正在尝试生成diff文件(补丁文件)并将此补丁应用于某些已部署的文件夹。我正在运行以下命令来生成diff文件:
tf diff version.asp /format:unified > C:\patch.diff
它产生类似的东西:
Comparing local to latest: C:\dev\folder\version.asp
File: version.asp
===================================================================
--- version.asp(local)2011-06-17 09:18 文字,文件名后,不应该在这里
+++ version.asp; 958(服务器)2011-09-19 14:27 同样在这里
@@ -13,7 +13,7 @@
'============================================================
Dim APP_VERSION, APP_BUILD, APP_DATE
APP_VERSION = 6
-APP_BUILD = 45
+APP_BUILD = 52
%>
\ No newline at end of file
============================================================
问题出现在粗体的行上。 UNIX 修补程序应用程序无法识别文件名,因为这些行应仅包含文件名而不包含任何其他信息。 如果我在这些行上删除文件名之后的文本, patch 将成功运行。 所以我的问题是:是否有可能从tf diff生成diff文件而在头文件中没有这样的信息,以便它与 patch 兼容?
还有一种替代方法,比如应用正则表达式并替换这些行,但这将是最后一次使其工作的尝试。
谢谢
更新
最后我得到了regex
,它从行中删除了那些不必要的信息,用Unix sed
实用程序运行它,我从MinGW
获得了Windows版本。
sed "s/^\(+++\|---\)\(.*\)\(\.[A-Za-z0-9]\{1,4\}\)\(.*\)$/\1\2\3/" C:\patch.diff > C:\patch.new
patch.diff
是从tfs
生成的格式错误的文件,在输出patch.new
上是正确的统一差异文件并与patch
实用程序兼容
UPDATE2
经过几个小时的撞击墙后,我发现在tfs
生成的差异文件中,Unicode扩展字符只是被转义或用其最接近的ASCII表示替换。
例如,如果代码中有ä
个字母,则在输出差异文件中,它将被简单的a
字母替换。
这使得从tfs
实用程序生成的diff文件无用。
这显然是一个错误。
供参考: 我正在使用vs2010和团队基础服务器2010.
答案 0 :(得分:1)
对于它的价值,我也想不出来。 TFS使用/ unified创建格式错误的文件。
我使用本地git install解决了这个问题:
(shelve change set)
tfpt scorch
git init
git add .
git commit -a -m "Original"
git checkout -b "New"
(checkout shelf in tfs)
git add .
git commit -a -m "Change"
git format-patch master
:/
答案 1 :(得分:1)
如果tf diff /format:unified
的输出与diff -u
不同且与patch
不兼容,那么这是您应该向Microsoft报告的错误
正如您所说,解决方法是繁琐地查找和替换。