2016-09-08 3 views
3

두 개의 git 태그 사이에서 수정 된 모든 파일을 포함하는 아카이브 생성을 자동화하는 간단한 PowerShell 스크립트를 만들었습니다.PowerShell Git diff에서 매개 변수로 전달하기

내가 한 몇 가지 테스트에서 꽤 잘 작동하는 것처럼 보였지만, 오늘날 동료는 특정 파일을 추가하지 않는다고 불평했습니다. 나는 그것을 디버깅하기 시작했고, 나는 아주 이상한 행동을보고있다.

수정 된 파일을 나열하는 데 사용하는 명령은 git diff이며, PowerShell 명령의 인수 (문자열)의받는 사람과 보내는 사람 태그를 전달합니다.

param(
    # Git tag or commit has from which we want the patch to start 
    [String] $FromTag, 
    # Path of the patch file 
    [String] $PatchFilePath, 
    # Git tag or commit hash where to we want the patch to update to (default HEAD, current checkout) 
    [String] $ToTag = "HEAD" 
) 
... 
$modifiedFiles = git diff $FromTag..$ToTag --no-commit-id --name-only --diff-filter=ACMRT 
... 

테스트 결과 파일이 실제로 누락 된 것으로 나타났습니다. 다음과 같이 명령을 수동으로 실행하기로 결정했습니다.

git diff v041.3.2..v041.3.6 --no-commit-id --name-only --diff-filter=ACMRT 

이 파일을 반환 한 사용자가 당황 스러웠습니다. 나는 다음을 시도했다 :

$FromTag = "v041.3.2" 
$ToTag = "v041.3.6" 
git diff $FromTag..$ToTag --no-commit-id --name-only --diff-filter=ACMRT 

어떤 파일도 있지만 그 중 일부는 반환하지 않는다.

나는 다음 수정 된 모든 파일의 일부를 반환 변수로 나에게 동일한 결과를 제공

git diff "v041.3.2".."v041.3.6" --no-commit-id --name-only --diff-filter=ACMRT 

전화를 시도했습니다.

나는 마지막 명령을 "DOS"명령 프롬프트에서 실행하여 git 문제인지 확인하려고했지만 올바른 파일 집합을 반환합니다.

PowerShell에서 문자열을 전달할 때 git에서 입력을 해석하는 방법에 차이가있는 것처럼 보입니다.하지만 실제로 이유와 이유는 없습니다.

여기에 관심있는 사람들의 전체 스크립트입니다 : PowerShell을에서 https://gist.github.com/Gimly/b865b0ed09f0f9fe13d12f6b0137ecfb

+1

그냥 테스트를 위해 http://itackoverflow.com/a/9934012/6309 에서처럼 자식을 선언 할 수 있습니까? – VonC

답변

4

실행 cmd /c echo $FromTag..$ToTag 및 첫 번째 변수 뒤에 공백을 볼 수 있습니다 :

v041.3.2 ..v041.3.6

큰 따옴표를 사용하여 하나의 매개 변수로있는 그대로 전달합니다 (따옴표는 프로그램에 전달되지 않음).

git diff "$FromTag..$ToTag" 
+0

공간이 추가되는 이유에 대한 단서가 있습니까? – Gimly

+0

실제 답변은 PS의 소스 코드에 묻혀있을 것입니다.하지만 파서가 똑똑 해 지려고 시도한 버그와 같습니다 : 분명히 '$ a .. $ b'는 변수 + 문자열 리터럴 포함 된 변수로 – wOxxOm

+0

예, 이해가됩니다. git-diff 구문 분석기가 매우 진보적이어서 받아 들일 수있는 것은 매우 이상한 버그였습니다. 그것이 당신의 도움과 영리한 방법으로 그것을 테스트하지 않았다면 나는 그것에 대해 몇 시간을 보낼 수있었습니다. 감사 – Gimly

관련 문제