다음은 임시 / 로컬 코드의 예입니다. 코드베이스로 작업하려면 필요하지만 그 일부가되는 것은 해 롭습니다.
- 프로젝트 파일. 현재 PC의 레이아웃을 반영하기 위해 경로를 편집해야 할 수도 있습니다.
- 메이크 파일. 예를 들어 디버깅 중에는 최적화를 해제해야하지만 CI 서버에는 최적화를 해제하지 않아도됩니다.
- 더러운 못생긴 해킹. 예를 들어
return 7
, 함수의 중간에, 함수에 따라 무언가를 테스트하기 위해, 값 7에서 깨질 것으로 의심되는 경우 내 지부의 삶.
나는 그것들을 git commit으로 유지하려고 노력했다 HEAD~
. 이것은 매우 불편하고 svn에서는 작동하지 않습니다. 스 태싱은 나를 더 무섭게한다 – “밀어 넣은 후에 터지는 것을 기억 했는가 ??”.
코드를 버전 제어에서 유지하면 커밋이 어셈블 될 때마다 불쾌한 노이즈가 발생하고 실수로 금요일 저녁 커밋이 발생할 수 있습니다.
그러한 버리기 코드를위한 적절한 솔루션은 무엇입니까?
답변
모든 코드는 일시적입니다. 변경을 할 때 가끔 자리 표시자를 소개합니다. 디자이너로부터 실제 아이콘을 기다리면서 그린 아이콘, 동료가 작성하고 아직 완료하지 않은 라이브러리를 호출 할 것입니다. 제거되거나 다른 조건부로 작성되는 추가 로깅, 테스트 팀에서 발견 한 버그 수정 등
모든 것을 확인하십시오. 모든 개발에 기능 브랜치를 사용하면 최종 버전을 트렁크로 병합 할 수 있으며 개발주기 동안 어떤 해킹 및 봇 및 수정 사항을 알 필요가 없습니다. 최종 버전을 참조하십시오. 그러나 정기적으로 지점에 헌신한다면 하루가 크게 잘못되거나 점심 시간 후에 술집에서 점심을 먹은 후에 코딩해야 할 것들을 볼 수 있습니다.
버전 제어는 아티팩트 저장소 또는 문서 스토리지 시스템이 아닙니다. 변화의 역사를 담는 것입니다. 언젠가는 당신이 무엇을보고 싶을 지에 대한 모든 것을 고수하십시오. 그리고 당신의 SCM이 진정 무엇에 관한 것인지 깨닫는 날들입니다.
추신. 진정한 임시 파일 (예 : .obj 또는 빌드 아티팩트)은 SCM에 없습니다. 이것들은 누구에게도 가치가없는 것들입니다. 당신은 그들이 무엇인지 알 수 있습니다-당신이 그들을 삭제하면 마음에 들지 않거나 심지어 사라졌습니다.
답변
프로젝트 파일. 현재 PC의 레이아웃을 반영하기 위해 경로를 편집해야 할 수도 있습니다.
프로젝트 파일의 경우 가장 좋은 전략은 스크립트를 통해 프로젝트 파일을 생성 할 수있는 것입니다. 실제 프로젝트 파일을 무시에 추가하고 필요에 따라 프로젝트 파일을 다시 생성하십시오. 예를 들어 Java 프로젝트에서는 Eclipse 프로젝트를 생성 할 수있는 gradle을 사용합니다.
메이크 파일. 예를 들어 디버깅 중에 최적화를 해제해야하지만 CI 서버에는 최적화를 해제하지 않아도됩니다.
Makefile을 수정하지 않고 최적화 모드와 디버그 모드 사이를 전환 할 수 있어야합니다. 대신, 저장소에없는 명령 행 플래그, 환경 변수 또는 별도의 파일을 사용하여이를 제어하십시오.
더러운 못생긴 해킹. 예를 들어, 함수에 따라 무언가를 테스트하기 위해 함수 중간에 7을 반환하고 값 7에서 깨질 것으로 의심되는 경우 7은 아직 구현되지 않은 버튼의 코드이며 구현 중이며 내 지점의 수명 동안 테스트합니다.
의심되는 고장 사례를 유도하는 테스트를 작성할 수 없습니까?
대부분의 경우 리포지토리의 파일을 변경하지 않도록 워크 플로를 조정할 수 있어야합니다. 로컬로 변경된 파일은 프로젝트의 무시 메커니즘에 추가해야하며 저장소에는 없어야합니다. 경우에 따라 리포지토리에 저장하고 싶지 않은 임시 변경 사항이 여전히 남아 있습니다. 이를 위해 XXX와 같은 특수 시퀀스를 추가하고 커밋을 거부하는 프리 커밋 후크를 추가하십시오.
답변
버전 관리에는 응용 프로그램을 빌드하는 데 필요한 코드와 구성이 포함되어야합니다.
이것은 다음을 의미합니다.
-
짧은 시간 동안 소개 된 임시 항목 (예 : 버그의 위치를 정확히 지정하거나 언어의 기능을 실험하는 데 필요한 시간)은 버전 제어에 있어서는 안됩니다. 필요할 때까지 유지하십시오. 커밋 할 때 간단히 제거하십시오 .
-
특정 머신에 적합한 로컬 파일은 브랜치에 보관 될 수 있습니다.
랩톱을 도난 당하거나 바이러스로 인해 OS를 다시 설치해야 할 때이 모든 것을 다시 실행하는 것이 너무 고통 스럽기 때문에 로컬로 유지하지 않는 것이 좋습니다 (마지막으로 백업은 2 년 전에 완료 된 것으로 나타났습니다) .
다른 한편으로, 파일 구조에주의를 기울이십시오 : 로컬 설정은 압도적이 될 때까지 OK이며, 프로젝트에 참여하는 42 명의 개발자 모두의 모든 파일에서 한 번만 변경하도록합니다.
기계 사이의 특수성을 제거 할 기회를 찾으십시오. 다음을 의미 할 수 있습니다.
그래서:
프로젝트 파일. 현재 PC의 레이아웃을 반영하기 위해 경로를 편집해야 할 수도 있습니다.
모든 PC에서 동일한 레이아웃을 사용하지 않는 이유는 무엇입니까? 프로젝트 내 경로는 프로젝트 파일을 기준으로해야합니다. 즉, 프로젝트 위치는 중요하지 않습니다. 소프트웨어와 라이브러리의 버전은 일부 컴퓨터에만 나타나는 크립 틱 버그를 피하기 위해 동일하고 팀의 다른 구성원에게는 재현 할 수없는 것이 좋습니다.
예:
Visual Studio로 만든 프로젝트에서 다음을 찾을 수 있습니다.
-
파일 자체. 상대 경로는 내 컴퓨터에서 프로젝트가 있는지 여부에 관계없이
H:\Development\Hello World Project\
팀의 다른 구성원이 프로젝트를 체크 아웃했습니다C:\Work\HelloWorld\
. -
종속성, 즉 타사 및 사내 라이브러리 두 가지 유형 모두 NuGet에서 처리해야하므로 모든 충돌 관련 토론이 더 이상 사용되지 않습니다. 내가 보유한 라이브러리와 동일한 버전이 없으면 NuGet에 종속성을 업데이트하도록 요청하십시오. 그렇게 간단합니다 (잘 작동 할 때 항상 그런 것은 아닙니다).
사내 라이브러리를 개인 NuGet에도 보관하는 것이 중요합니다. 여러 개의 라이브러리를 공유 폴더에 저장하거나 팀을 통해 전자 메일로 보내면 무질서하고 우울한 CI 서버가됩니다.
-
설정. 팀이 동일한 설정을 공유하는 것이 중요합니다. 팀의 절반이 경고를 오류로 처리하기로 결정하고 팀의 절반이 그대로 경고를 유지하면 팀의 첫 번째 구성원은 개발자가 생성 한 경고를 팀의 두 번째 부분에서 제거하는 데 시간을 소비합니다.
-
유틸리티 관련 설정 팀 구성원 중 일부는 일부 유틸리티를 설치했지만 다른 일부는 설치하지 않았기 때문에 까다로울 수 있습니다.
동일한 툴셋을 설치하는 것이 좋습니다. 일부 프로그래머는 StyleCop을 사용하고 싶지만 다른 프로그래머는 사용하지 않으면 팀이 작업을 수행하지 못합니다. 일부는 코드 계약을 사용하지만 다른 계약은 사용하지 않는 경우 동일한 문제가 발생합니다.
메이크 파일. 예를 들어 디버깅 중에는 최적화를 해제해야하지만 CI 서버에는 최적화를 해제하지 않아도됩니다.
여러 개의 makefile을 버전 관리에 보관하십시오. CI 서버에서도 디버그 버전을 빌드하고 까다로운 버그가 발생하는 클라이언트로 푸시하는 것은 드문 일이 아닙니다.
더러운 못생긴 해킹. 예를 들어, 함수에 따라 무언가를 테스트하기 위해 함수 중간에 7을 반환하고 값이 7 인 것으로 의심됩니다.
처음에는 그러한 코드를 피할 것입니다. 무언가를 테스트하려면 단위 테스트를 사용하십시오. 디버깅 목적으로 일부 코드를 교체하는 데 실제로 몇 초가 걸리면 수행하십시오. 그러나 몇 분 안에이 코드를 제거하므로 커밋 할 필요가 없습니다.
설명 할 때 테스트를 작성해야합니다. 예를 들어, 다음을 확인하려는 경우 :
class TemperatureConverter
{
public int CelsiusToFahrenheit(int temperature)
{
...
}
}
상수 temperature
보다 열등한 경우 예외가 발생 AbsoluteZero
하므로 코드 자체로 연주해서는 안됩니다. 대신 다음과 같은 단위 테스트를 작성하십시오.
- 코드를 자기 문서화하고
- 코드의 신뢰성을 높이고
- 위의 방법을 수정할 때 관리자가 회귀 테스트에 의존 할 수 있는지 확인하십시오.
- 동일한 테스트를 수행해야하는 다른 팀 개발자에게 제공하십시오.
답변
우리 @@
는 코드에서 주석을 사용 하여 테스트 목적 등으로 아직 준비되지 않은 것을 표시합니다.
그렇게하면 동료들이 동기화하기 위해 너무 오래 기다릴 필요가 없으며 여전히 진행중인 작업을 확인할 수 있습니다 (예 : 부품이 아직 완전하게 작동하지 않는 이유 이해).
@@
베타 테스트 등의 마지막 단계에 들어가기 전에 ‘남은 음식’을 방지하기 위해 글로벌 검색을 수행합니다.
그 훈련을 사용하여, 나는 커밋 할 이유가 없습니다 . 이러한 방식으로 별도의 지점이없고 따로 따로 추가 할 ‘프로토콜’이 하나만 있습니다.
추가적인 이점으로,이 할 일 (보통 작은 것)은 항상 코드에 있습니다. 작업중인 개발자는 신속하게 처리 할 수 있으며 별도의 목록을 유지할 필요가 없습니다.
당신은 개발이가는 방법을 알고 : 당신이 한 곳에서 노력하고 있지만 ( ‘당신이 지속적으로 스택으로 당신의 마음을 사용하고 난 여기가 끝났어요 때 이상 나는 것을 변경해야합니다 ‘). 빠른 설명을 적어두면 @@
스택 오버플로가 방지됩니다.
나는 심지어 @@name
‘이름’과 논의해야 할 문제를 나타 내기 위해 사용 합니다.
답변
햄스터 솔루션 2 개 :
-
사전 커밋 후크를 사용하여 코드에서 HAMSTER와 같은 비정상적인 키워드를 확인할 수 있습니다. 사람들이 해킹당한 코드를 커밋하지 말고 더러운 해킹을 할 때마다 사용하십시오.
-
예를 들어 C에서 또 다른 옵션은 #ifdef HAMSTER를 사용하는 것입니다. 그러면 코드는 컴파일러 플래그 HAMSTER가있는 시스템에서만 실행됩니다.
답변
우리 는 현재 바이너리 를 빌드 하고 테스트 하는 데 필요한 모든 것을 소스 제어하에두고 왜 사물이 원래대로 설계 / 구현 / 테스트 되었는지 이해했습니다 .
그것은 심지어 당신이 묘사 한 것과 같은 스파이크 http://www.extremeprogramming.org/rules/spike.html을 보유합니다 . 다른 하위 트리에서 호스팅합니다.
답변
다음은 다양한 상황에서 때때로 사용하는 여러 가지 솔루션입니다. 자신의 워크 플로에 적용 할 때 도움이 될 수 있습니다.
-
찌그러 질 수있는 가벼운 가지.
힘내 이것에 위대하다. 지점을 해킹하고 커밋을 많이 한 다음 기록을 리베이스하거나 스쿼시하여 노이즈를 편집하십시오.
-
SCM 위에 패치 대기열을 사용하십시오.
나는 종종 StGit 을 사용하여 패치를 현재 브랜치 상단에 띄웁니다 . 분기가 끝나면 병합, 스쿼시 또는 리베이스하기 전에 스택에서 다시 튀어 나오거나 유지하려면 기본 코드베이스로 병합 할 수 있습니다.
-
소규모 실험에서는 RCS 를 “대역 외”SCM으로 사용하십시오 .
때로는 나중에 기록을 정리하지 않고 일회용 파일로 진행중인 파일을 체크 포인트하려고합니다. 나는 일반적으로 Git 또는 SVN 내부에서 RCS를 사용합니다. 나는 Git에게 RCS 아티팩트를 무시하고 RCS에서 진행중인 작업을 체크 포인트하고 결과를 좋아할 때
*,v
파일이나 전체 RCS 디렉토리를 던져 버린다 .git clean -fdx
작업을 “실제”SCM에 맡길 때까지 실행 하거나 이와 유사한 작업을 수행하지 않으면 후회하게됩니다. -
이름이 숨겨져 있습니다.
또 다른 Git-ism이지만 편리합니다.
git stash save --include-untracked <some-cool-title>
꼬집음에 유용 할 수 있습니다. 당신은 저장, 팝,이 방법을 진행중인 작업을 적용하고,을 통해 다양한 체크 포인트를 볼 수 있습니다git stash list
또는git reflog --all
. 다른 SCM의 기능은 비슷하지만 마일리지가이 기능에 따라 크게 다를 수 있습니다.