2016-09-15 2 views
1

브랜치 master (프로덕션 서버에서)보다 앞서 지점 origin/master (테스트 서버에서)이 있습니다. 나는 origin/master에서 master까지 하나씩 커밋을 적용하여 각 단계에서 애플리케이션이 이러한 커밋에 어떻게 반응하는지 관찰하고 싶습니다.git을 사용하여 테스트 서버에서 프로덕션 서버로 지속적으로 배포

git cherry-pick을 사용했지만 커밋 체크섬이 수정되었습니다. 나는 같은 역사를 지키고 싶다.

origin/master의 커밋 목록을보고 올바른 커밋을 수동으로 선택하여 git merge <commit>을 하나씩 실행할 수도 있지만 "다른 커밋을 적용하는 것과 같은 명령을 찾고 있습니다. 두 가지 ".

+0

체리 선택, 재설정 및 병합을 수행 할 수 있지만 다소 번거롭습니다. 아마도이 프로세스는 몇몇 쉘 스크립트를 사용하여 자동화 될 수 있습니다. – Dunno

답변

0

체크섬은 커미터, 커밋 날짜, 작성자, 커밋 메시지 및 트리 객체의 해시와 기타 정보를 사용하여 계산 된 해시입니다. 커밋이 수정 될 때마다 고유 할 것이고 주위에 어떤 방법이 있는지 (또는 심지어 원하는 경우) 알 수 없습니다.

cherry-pick 할 때 원래 커밋 해시를 자동으로 커밋 메시지에 추가하는 -x 매개 변수를 찾는 것처럼 들립니다. 당신은 항상 당신이 이제까지 필요로 할 경우 원래의 커밋을 찾을 수 있도록 원래 해시를 커밋이

git cherry-pick -x 60aa086c5d8d68fdeb47d02d9e06a6420e721295 

과 역사

git log 
    commit 6287d63090736c9a1ae58d578d2d395896561f27 
    Author: Kief Kraken <[email protected]> 
    Date: Tue Sep 13 16:31:36 2016 -0700 

     original commit message 
     (cherry picked from commit 60aa086c5d8d68fdeb47d02d9e06a6420e721295) 

이 방법 :

는 여기에 내가 방금 만든 예입니다.

+0

'git merge '을 사용하여 수동으로 올바른 커밋을 선택하면 트릭을 수행합니다. 하지만 자동으로 두 지점간에 다른 첫 번째 커밋을 선택하고 싶습니다. –

1

이 (테스트되지 않은) bash 스크립트는 무엇입니까?

# CREATES A master_test BRANCH STARTING ON master 
git checkout -b master_test master 

# FOR ALL DIFFERENT COMMITS 
for h in $(git log --pretty=format:%H master..origin/master) 
do 
    # MERGE THE COMMIT 
    git merge $h 

    # PAUSE TO "OBSERVE" 
    echo "Paused" 
    read pause 
done 
+0

좋은 생각이지만 for 루프는 약간의 bash 애매한 행동으로 인해 하나의 반복에서 모든 커밋을 취합니다. 아마도 git log 명령에서 오는 줄 바꿈 처리와 관련이 있습니다. –

+0

IFS 변수의 값을 확인하십시오 (echo X $ {IFS} X). 나는 당신이 IFS 변수에 대해 기본값이 아닌 값을 가지고 있다고 생각합니다. 기본값은 공백 (공백, 탭 및 줄 바꿈)이지만, 예를 들어 쉼표로 구분 된 데이터 파일을 구문 분석하기 위해 변경할 수 있습니다 (추가 정보 :이 문서의 "IFS"를 검색하십시오. http : // tldp. org/LDP/abs/html/internalvariables.html). –

+0

'IFS = $ '\ t \ n''을 사용하면 문제가 해결되지 않습니다.'GNU bash, 3.2.57 (1) -release (x86_64-apple-darwin15)'를 사용하고 있습니다. –

1

이 경우 bisect을 사용할 수 있습니다. 알려진이 좋은 커밋과 나쁜 커밋 사이의 커밋을 선택하는 프로세스 (바이너리 검색 사용)를 자동화하여 찾고있는 동작을 유발 한 원래 커밋을 찾습니다.

+0

실제로, 저는 두 개의 분기간에 다른 첫 번째 커밋에서 하나씩 커밋을 적용하고 싶습니다. 이것을하기 위해'bisect'를 어떻게 사용합니까? –

+0

@OrtomalaLokni 한 번에 하나씩 적용하지 않지만 두 커밋간에 이진 검색을 수행하여 문제를 찾습니다. 문제가있는 커밋을 찾고있는 경우에는 한 번에 하나씩 커밋을 적용하는 것보다 이진 검색이 빠릅니다. 각 커밋 후에 코드가하는 것을보고 싶다면 bisect가 도움이되지 않습니다. – Andy

+0

테스트 서버에서 프로덕션 서버로의 지속적인 배포를위한 것입니다.그래서 'git bisect'는 흥미로운 도구라고해도 해결책이 아닙니다. –

관련 문제