2016-09-16 54 views
7

是否有任何自动方式来验证Git仓库中的所有提交都处于可编译状态?确认C#项目的所有Git提交在重写历史后编译

我需要这个来验证我重写历史后没有损坏任何东西。由于我正在重写历史记录,因此不包括构建服务器 - 在提交时提交的提交可能会在重写历史记录后中断。

比如我有一个Visual Studio 2015年C#项目,和我想象中的一些脚本,如:

git filter-branch --tree-filter msbuild 

我希望它运行构建每次提交,并以一个错误消息,如果在生成过程停止返回非零值。

+0

你为什么不创建编译脚本文件,然后你只需要传递一个类似'./ compile.sh'的命令? – pedrorijo91

+0

相关:http://stackoverflow.com/a/26985189/1615903 – 1615903

回答

5

考虑到树过滤器将一个Git的bash执行该命令,你可能想使用

git filter-branch --tree-filter "MSBuild.exe" 

(确保你的%PATH%不包括c:\Program Files (x86)\MSBuild\14.0\Bin
(或use forward slash as in here

那将同样适用于other option提及in the comments

git rebase -i --exec MSBuild.exe <first sha you want to test>~ 

您可以使用CMD session similar to this gist,从Tim Abell

@echo off 
REM batch script for loading git-bash and the vs tools in the same window 
REM inspiration: http://www.drrandom.org/post/2011/11/16/Grappling-with-multiple-remotes-in-git-tfs.aspx 
REM screenshot: https://twitter.com/#!/tim_abell/status/199474387731226624/photo/1 
%HOMEDRIVE% 
cd %HOMEPATH% 
call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86 
echo Use full exe names when running under bash, e.g. "msbuild.exe" 
echo Loading bash, you may now use git and msbuild in the same console \o/. 
"C:\Program Files (x86)\Git\bin\sh.exe" --login -i 
2

假设你要检查所有的历史提交的回购,而不是未来的承诺:

您可以使用git bisect做到这一点:

git bisect start 
git bisect bad # Mark the current HEAD as bad 
git bisect good <the first commit> 

然后,您需要运行的MSBuild脚本,对于构建错误返回1,对于成功构建则返回125。这是因为我们不能将任何构建标记为“良好”,因为我们不知道这个构建之前的提交是否也可以工作,所以我们跳过那些可行的构建。

然后,启动与run命令平分:

git bisect run myscript 

这将然后启动运行构建(在一个非连续的顺序),直到找到一个破碎的构建,并停止。有关更多说明,请参阅https://git-scm.com/docs/git-bisect#_bisect_run

+0

我想重写历史记录后,在每次提交时运行它。从我所了解的Git bisect中,它将执行binsearch而不是遍历每一次提交。这更多的是捕捉特定的错误,我不确定它与我的问题有什么关系。无论如何,我编辑了我的问题来添加关于重写历史的部分。 – sashoalm

+0

@sashoalm我明白了,我忽略了一些问题。我稍微修改了答案 - 它不按时间顺序执行构建,但除此之外,似乎符合您的要求。 – 1615903

2

什么(上Git BashGit Posh测试):

  1. 创造的MSBuild命令git的别名:

    git config --global --add alias.msbuild "!c:\path\to\msbuild.exe"

如果“msbuild.exe”路径存在于PATH env。 var,你可以写“!msbuild”而不是完整的路径。

  • 然后运行命令:

    git filter-branch --tree-filter "git msbuild"