2016-09-16 52 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"