2013-08-08 4 views
2

저는 대학원생이고 연구를위한 주요 장소는 소프트웨어 시뮬레이션입니다. 나는 결과를 생성하는 데 사용하는 C++ 코드가 있지만 내 큰 문제는 재현성을 위해 노력하기 때문에 바이너리에 충분한 메타 데이터를 저장하여 해당 바이너리를 생성 한 정확한 소스 코드로 돌아갈 수 있다는 것이다. 주로 내가 발견 한 버그가 이전에 생성 된 일부 결과를 무효로하는지 확인하기 위해). 내가 출력 파일의 세트를 생성 할 때git commit 및 git diff를 문자열로 바이너리로 변환 하시겠습니까?

는, 나는 이진은 모두 자식이 현재 버전뿐만 아니라 뛰어난 변경 커밋 덤프합니다. 이렇게하면 저에게 (이론적으로) 커밋을 체크 아웃하고, 저장된 패치를 적용하고, 바이너리를 생성 한 정확한 소스 코드로 돌아갈 수 있습니다.

정보를 수동으로 저장하여이 작업을 수행 할 수 있음을 알고 있지만 완전한 일관성을 유지하기 위해 모든 바이너리가 정보를 직접 작성할 수 있도록 바이너리로 바로 굽기를 원합니다. 정확한 출처로 거슬러 올라감.

git commit SHA1과 같은 것을 저장하기 위해 메이크 파일에서 #define 플래그를 설정하는 것에 익숙하지만, git diff를 문자열로 저장하는 더 영리한 방법이 필요하다고 생각합니다. 바이너리

  1. 이 끔찍한 생각이 :

    그래서 나는 몇 가지 질문이? 바이너리를 소스로 추적하는 더 나은 접근법이 있습니까?

  2. 이 작업을 수행하는 최적의 방법은 무엇입니까?

감사합니다.

편집 : 난은 diff를 저장하려는 이유는 현재의 머리 위에 어떤 커밋되지 않은 변경 사항을 캡처하는 것입니다 내가 명확하게하지 않은 것 같아요. 해시를 저장할 수는 있지만 커밋되지 않은 항목이 포함 된 바이너리를 실수로 사용하면 올바른 소스를 다시 가져올 수 없습니다.

답변

3

코드에서 자식 "ID"번호 (해시)를 저장 나쁜 생각이 아니다. diff를 저장하면 해쉬가 (어떤 브랜치와 함께 왔는지에 따라) 원래의 코드로 돌아갈 수 있기 때문에 꽤 무의미합니다.

그냥 확인 빌드 및 테스트 시스템을 당신이 약속되지 않은 것을, 당신이 빌드에 최선을 다하고되지 않은 어떤 임의의 변경 사항이 할 수없는 방법을 사용할 수 없다는 설정 등이다 .

편집 : 컴퓨터의 테스트와 프로젝트의 로컬 복사본, 그리고 모든 것을 검사하는 테스트 스위트를 사용하여 테스트하는 것의 차이점은 모든 것이 올바르게 작동하는지 확인하는 것입니다. 다른 사람이 해당 코드의 사본을 얻을 때까지는 테스트 한 내용이 실제로 중요하지 않습니다. 다른 사람이 커밋 될 때까지 다른 사람이 코드를 볼 수 없도록하고 테스트를 저장하는 전체 테스트 스위트를 허용하지 않습니다. 릴리스 노트 등의 결과가 모든 것을 저지른 경우 실행하거나 [또는 더 나은 방법으로 중앙 디렉토리에서 신선한 코드 만 가져 오는 별도의 디렉토리/시스템을 가지고있는 경우 실행하십시오. 그렇게하면 그럴 수 없습니다 커밋되지 않은 코드를 사용하십시오.

나는 그 방법으로 작동하는 몇 가지 프로젝트를 수행했다. 커밋되지 않은 코드로 로컬 디렉토리에 빌드 할 수 있지만 모든 "공식 빌드"는 다른 머신에서 수행되며 코드는 항상 저장소에서 곧바로 작성되며 로컬 변경은 없다. .

두 대의 컴퓨터가없는 경우 "가상 머신이"별도의 시스템처럼 작동 "하거나"공식 테스트 "에 사용하는 두 번째 디렉토리 [또는 다른 사용자]를 사용하는 경우 일 수 있습니다.

실제로 차이점이있는 경우 "차이점이있는 경우"와 함께 몇 가지 차이점이 있는지 간단히 확인하고 "차이점이있는 경우"추가 "-with-uncommitted-changes"또는 이와 유사한 내용을 추가 할 수 있습니다 . git diff --exit-code을 사용하면 "변경 사항 없음"또는 "변경 사항"에 대해 0 또는 1 종료 코드를 사용할 수 있습니다.

+0

일종의 작동하지만 변경 사항을 테스트하기 위해 바이너리를 빌드 할 수 있어야합니다. 필자가 바이너리를 빌드 할 수 있다면 필연적으로 커밋되지 않은 변경 사항이 추가 된 바이너리로 결과를 생성하는 실수를 범합니다. – KarateSnowMachine

+0

@KarateSnowMachine : 그렇다면 커밋 스크립트를 설정하여 변경 사항이 커밋되지 않은 경우 실패합니다. 자식으로, 어쨌든 커밋을 자주하는 것이 좋습니다. – sleske

+0

@KarateSnowMachine : 편집을 참조하십시오 (너무 짧아서 주석으로 모두 쓸 수 없습니다. 편집하기 전에 충분히 빨리 볼 수 있으면 몇 분 안에 있어야합니다). –

2
  1. 두 가지 아이디어가 설명되어 있습니다. 단 하나만 끔찍합니다. 해시를 저장하십시오. 당신은 (1 참조)
  2. 그냥 해시를 저장하는 것이에서,은 diff를 포함하여 다른 모든 메타 데이터를 복구 할 수 있습니다 - 당신은 이미 자식 SHA1 ID를 저장이
+0

글쎄, diff를 저장하는 요지는 커밋되지 않은 변경 사항을 현재 HEAD 위에 저장하는 것입니다. – KarateSnowMachine

+0

커밋되지 않은 소스에서 릴리즈 빌드를 생성하지 마십시오. 'git diff'의 출력은 아직 추가하지 않은 새 파일을 생략하기 때문에 충분하지 않습니다. – Useless

2

을 수행하는 방법을 알고 상태를 충분히에서 공정하다 당신이 성취하고자하는 것에 대한 기술적 관점

커밋되지 않은 변경 사항? 빌드 프로세스가 실패한 경우이를 설정하십시오.
빌드 엔지니어링이 너무 힘들거나 너무 많은 작업 인 경우 더 많은 규율을 보여줍니다. :)

편집 :
셸 스크립트를 통해 빌드하십시오. 변경 사항을 확인하기 전에 git diff --exit-code이 도움이 될 수 있습니다.

편집 2 : 코드의 많은 개정을 디버깅해야하는 경우
git help bisect이 편리 할 수 ​​있습니다.

2

나는이 문제에 대한 최선의 대답은 "그렇게하지 마라"라고 생각합니다. 반복 가능한 빌드를 원할 경우 커밋 된 변경 사항에 대해서만 빌드하고 더러운 작업 디렉토리에는 빌드하지 마십시오. 필요한 경우, 작동하지 않거나 저장소 (예 : 빌드를 반복하는 사용 사례)에 남겨두고 폐기 할 수있는 측점에서 실험적 내용을 커밋하고 해당 분기와 작업을 포기하십시오. 또 다른 새로운 지점에. 빌드를 위해 다시 돌아가고 싶은 특정 포인트 만 있다면 해당 커밋에 적절한 태그를 놓는 것을 고려하십시오.