임시 코드를 버전 관리하에 두어야합니까?


29

다음은 임시 / 로컬 코드의 예입니다. 코드베이스로 작업하려면 필요하지만 그 일부가되는 것은 해 롭습니다.

  1. 프로젝트 파일. 현재 PC의 레이아웃을 반영하기 위해 경로를 편집해야 할 수도 있습니다.
  2. 메이크 파일. 예를 들어 디버깅 중에는 최적화를 해제해야하지만 CI 서버에는 최적화를 해제하지 않아도됩니다.
  3. 더러운 못생긴 해킹. 예를 들어 return 7, 함수의 중간에, 함수에 따라 무언가를 테스트하기 위해, 값 7에서 깨질 것으로 의심되는 경우 내 지부의 삶.

나는 그것들을 git commit으로 유지하려고 노력했다 HEAD~. 이것은 매우 불편하고 svn에서는 작동하지 않습니다. 스 태싱은 나를 더 무섭게한다 – "밀어 넣은 후에 터지는 것을 기억 했는가 ??".

코드를 버전 제어에서 유지하면 커밋이 어셈블 될 때마다 불쾌한 노이즈가 발생하고 실수로 금요일 저녁 커밋이 발생할 수 있습니다.

그러한 버리기 코드를위한 적절한 솔루션은 무엇입니까?


이 임시 코드는 임시 사용 기간 동안 원래 프로젝트에서 업데이트해야합니까?
JeffO

@JeffO, 내가 당신을 이해하는지 확실하지 않습니다. 더티 스 니펫은 작고 개발중인 코드와 거의 충돌하지 않습니다. 그러나 @ Blrfl은 주류에 투입되는 것이 매우 위험합니다. 여름철 더위에 합병 후 금요일 저녁에 a return 7를 상상해보십시오 trunk.
Vorac

@Vorac-이것이 코드 검토 및 테스트를위한 것입니다! 언뜻보기에는 잘 보이지만 작동하지 않는 코드보다 훨씬 나빠 보여줄 수 있습니다. Return 7.. 그들 모두가 너무 분명하다면!
gbjbaanb

@Vorac : 그것은 다른 어떤 것보다 철학적 인 의견이었습니다.
Blrfl

2
현재 어떤 환경인지 알 수있는 방법이 있습니까? 예를 들어 개발자 환경에 있지만 val / prod에는없는 것으로 감지되면 코드를 실행하도록 설정할 수 있습니다. 그렇게하면 커밋 할 때 자리 표시 자 코드를 지속적으로 추가 / 제거 할 필요가 없습니다.
Saggio

답변:


46

모든 코드는 일시적입니다. 변경을 할 때 가끔 자리 표시자를 소개합니다. 디자이너로부터 실제 아이콘을 기다리면서 그린 아이콘, 동료가 작성하고 아직 완료하지 않은 라이브러리를 호출 할 것입니다. 제거되거나 다른 조건부로 작성되는 추가 로깅, 테스트 팀에서 발견 한 버그 수정 등

모든 것을 확인하십시오. 모든 개발에 기능 브랜치를 사용하면 최종 버전을 트렁크로 병합 할 수 있으며 개발주기 동안 어떤 해킹 및 봇 및 수정 사항을 알 필요가 없습니다. 최종 버전을 참조하십시오. 그러나 정기적으로 지점에 헌신한다면 하루가 크게 잘못되거나 점심 시간 후에 술집에서 점심을 먹은 후에 코딩해야 할 것들을 볼 수 있습니다.

버전 제어는 아티팩트 저장소 또는 문서 스토리지 시스템이 아닙니다. 변화의 역사를 담는 것입니다. 언젠가는 당신이 무엇을보고 싶을 지에 대한 모든 것을 고수하십시오. 그리고 당신의 SCM이 진정 무엇에 관한 것인지 깨닫는 날들입니다.

추신. 진정한 임시 파일 (예 : .obj 또는 빌드 아티팩트)은 SCM에 없습니다. 이것들은 누구에게도 가치가없는 것들입니다. 당신은 그들이 무엇인지 알 수 있습니다-당신이 그들을 삭제하면 마음에 들지 않거나 심지어 사라졌습니다.


5
동의했다. 분기는 갈 길입니다. 분기를 작성하고 원하는 것을 수행하고 완료되면 완성 된 코드를 병합하십시오. 헤드는 클라이언트가 언제든지 다운로드하여 사용할 수있는 릴리스 버전으로 취급해야합니다.
카메론 맥케이

큰 대답은 내가 본 것에서 로컬 버전 관리를 부분적으로 도입하여 로컬 작업에 대한 로그를 갖고 싶은 사람들을 돕는 것입니다. 임시 코드는 개발자의 컴퓨터
InformedA

2
"모든 코드는 임시입니다"라는 큰 포스터를 인쇄하여 벽에 붙입니다. 아마 코믹 산에서.
Bob Tway

2
Clippy의 입술에서 나오는 거품 인용문의 @MattThrower?
gbjbaanb

1
실행되지 않는 코드 또는 컴파일되지 않은 코드는 버전 제어에 전념해서는 안됩니다.
Tulains Córdova

17

프로젝트 파일. 현재 PC의 레이아웃을 반영하기 위해 경로를 편집해야 할 수도 있습니다.

프로젝트 파일의 경우 가장 좋은 전략은 스크립트를 통해 프로젝트 파일을 생성 할 수있는 것입니다. 실제 프로젝트 파일을 무시에 추가하고 필요에 따라 프로젝트 파일을 다시 생성하십시오. 예를 들어 Java 프로젝트에서는 Eclipse 프로젝트를 생성 할 수있는 gradle을 사용합니다.

메이크 파일. 예를 들어 디버깅 중에 최적화를 해제해야하지만 CI 서버에는 최적화를 해제하지 않아도됩니다.

Makefile을 수정하지 않고 최적화 모드와 디버그 모드 사이를 전환 할 수 있어야합니다. 대신, 저장소에없는 명령 행 플래그, 환경 변수 또는 별도의 파일을 사용하여이를 제어하십시오.

더러운 못생긴 해킹. 예를 들어, 함수에 따라 무언가를 테스트하기 위해 함수 중간에 7을 반환하고 값 7에서 깨질 것으로 의심되는 경우 7은 아직 구현되지 않은 버튼의 코드이며 구현 중이며 내 지점의 수명 동안 테스트합니다.

의심되는 고장 사례를 유도하는 테스트를 작성할 수 없습니까?

대부분의 경우 리포지토리의 파일을 변경하지 않도록 워크 플로를 조정할 수 있어야합니다. 로컬로 변경된 파일은 프로젝트의 무시 메커니즘에 추가해야하며 저장소에는 없어야합니다. 경우에 따라 리포지토리에 저장하고 싶지 않은 임시 변경 사항이 여전히 남아 있습니다. 이를 위해 XXX와 같은 특수 시퀀스를 추가하고 커밋을 거부하는 프리 커밋 후크를 추가하십시오.


때로는 파일에 작은 해킹을 수행하는 동시에 동일한 파일에 프로덕션 코드를 작성해야합니다. svn부분 파일 커밋을 지원하지 않으므로 이러한 상황에서 어려움이 있습니다. 내 동료 대부분은 지점에 해킹을하고 합병 할 때 제거합니다 trunk. 그러나 나는 혼란스러워하고 병합 중에 실수를하고 svn의 병합은 신성하고 불변입니다.
Vorac

@Vorac, 커밋 할 때 스크립트를 실행할 수있는 서브 버전 후크를 살펴 보겠습니다. XXX 등이 포함 된 경우 병합을 거부하는 스크립트를 작성할 수 있어야합니다.
Winston Ewert

1
@Vorac : TortoiseSVN을 사용하는 경우 파일에서 커밋 후 복원을 사용하여 부분적으로 커밋하고 diff 도구 또는 편집기를 사용하여 커밋하지 않으려는 블록을 임시로 제거한 다음 커밋 할 수 있습니다. Tortoise는 즉시 전체 파일을 복원하며 준비가되면 나머지 블록을 커밋 할 수 있습니다. 파일을 빠르게 백업하고 첫 번째 커밋 후에 파일을 복원하면됩니다.
leokhorn

5

버전 관리에는 응용 프로그램을 빌드하는 데 필요한 코드와 구성이 포함되어야합니다.

이것은 다음을 의미합니다.

  • 짧은 시간 동안 소개 된 임시 항목 (예 : 버그의 위치를 ​​정확히 지정하거나 언어의 기능을 실험하는 데 필요한 시간)은 버전 제어에 있어서는 안됩니다. 필요할 때까지 유지하십시오. 커밋 할 때 간단히 제거하십시오 .

  • 특정 머신에 적합한 로컬 파일은 브랜치에 보관 될 수 있습니다.

    랩톱을 도난 당하거나 바이러스로 인해 OS를 다시 설치해야 할 때이 모든 것을 다시 실행하는 것이 너무 고통 스럽기 때문에 로컬로 유지하지 않는 것이 좋습니다 (마지막으로 백업은 2 년 전에 완료 된 것으로 나타났습니다) .

    다른 한편으로, 파일 구조에주의를 기울이십시오 : 로컬 설정은 압도적이 될 때까지 OK이며, 프로젝트에 참여하는 42 명의 개발자 모두의 모든 파일에서 한 번만 변경하도록합니다.

    기계 사이의 특수성을 제거 할 기회를 찾으십시오. 다음을 의미 할 수 있습니다.

    • 개발자 컴퓨터의 로컬 인스턴스를 대체하기 위해 개발자 SQL 서버에 대한 액세스 권한 제공

    • Pypi 또는 npm 과 같은 패키지 배포 서비스 를 공개 패키지 용으로 사용하고 자체 전용 패키지를 사내 패키지 용으로 사용

    • 팀원에게 동일한 버전의 소프트웨어를 설치하도록 요청하십시오.

    • 소프트웨어 업데이트를 최대한 투명하게하고

    • 또는 한 번의 클릭으로 OS와 필요한 소프트웨어를 컴퓨터에 배포 할 수 있습니다 (모든 개발자가 선호하는 Vim vs. Emacs, Chrome vs. Firefox 등을 설치할 수있는 시간)

그래서:

프로젝트 파일. 현재 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하므로 코드 자체로 연주해서는 안됩니다. 대신 다음과 같은 단위 테스트를 작성하십시오.

  • 코드를 자기 문서화하고
  • 코드의 신뢰성을 높이고
  • 위의 방법을 수정할 때 관리자가 회귀 테스트에 의존 할 수 있는지 확인하십시오.
  • 동일한 테스트를 수행해야하는 다른 팀 개발자에게 제공하십시오.

2
불행히도 나는 테스트 작성 경험이 없습니다. 현재 플랫폼에는 ARM CPU가 포함되어 있으며 USB 명령에 응답하여 일부 하드웨어를 구성합니다. 하드웨어에서 CPU 로의 피드백이 없습니다.
Vorac

2
임시 코드에 지속적인 효과가있을 수 있지만, 일단 이러한 효과가 달성되면 코드가 필요하지 않더라도 효과가 올바르게 달성되었는지에 대한 의문이있는 경우 코드를 어딘가에 유지하는 것이 현명하다고 생각합니다. 예를 들어, 제품 개발 중에 제품의 일부 데이터베이스 형식이 변경된 경우 빠른 일회성 유틸리티를 작성하여 형식을 변경할 수 있습니다. 기존 형식의 기존 데이터베이스 만 변환 한 후에는 유틸리티가 필요하지 않지만 변환 방법을 조사해야 할 수도 있습니다.
supercat

Visual Studio 프로젝트 파일의 경우 CMake를 사용하여 파일을 생성 한 경험이 있습니다.이를 통해 파일 시스템에서 소스 코드와 컴파일 된 코드의 위치를 ​​정확하게 지정할 수 있습니다. 그런 다음 VS 프로젝트 파일 대신 CMake 입력 파일을 버전 제어합니다. 그러나 이것은 여전히 ​​"버전 제어에는 응용 프로그램을 빌드하는 데 필요한 코드와 구성이 포함되어야합니다." 나는 그것에 완전히 동의한다!
David K

VS로, 당신은 때때로 당신이 절대 경로에 몰래하지 않을 수 있도록주의를 취할 필요가 I 한 쳤에 더 많은 제 3 자 플랫폼의 Win64로 업그레이드와 가진 라이브러리에서 이동 터진 참조가 몇 가지 문제보다는. C:\Program Files\...C:\Program Files (x86)\...
Dan Neely

@ DanNeely : NuGet에서 타사 라이브러리를 처리 해야하는 이유입니다.
Arseni Mourzenko

2

우리 @@는 코드에서 주석을 사용 하여 테스트 목적 등으로 아직 준비되지 않은 것을 표시합니다.

그렇게하면 동료들이 동기화하기 위해 너무 오래 기다릴 필요가 없으며 여전히 진행중인 작업을 확인할 수 있습니다 (예 : 부품이 아직 완전하게 작동하지 않는 이유 이해).

@@베타 테스트 등의 마지막 단계에 들어가기 전에 '남은 음식'을 방지하기 위해 글로벌 검색을 수행합니다.

그 훈련을 사용하여, 나는 커밋 할 이유가 없습니다 . 이러한 방식으로 별도의 지점이없고 따로 따로 추가 할 '프로토콜'이 하나만 있습니다.


추가적인 이점으로,이 할 일 (보통 작은 것)은 항상 코드에 있습니다. 작업중인 개발자는 신속하게 처리 할 수 ​​있으며 별도의 목록을 유지할 필요가 없습니다.
당신은 개발이가는 방법을 알고 : 당신이 한 곳에서 노력하고 있지만 ( '당신이 지속적으로 스택으로 당신의 마음을 사용하고 난 여기가 끝났어요 때 이상 나는 것을 변경해야합니다 '). 빠른 설명을 적어두면 @@스택 오버플로가 방지됩니다.

나는 심지어 @@name'이름'과 논의해야 할 문제를 나타 내기 위해 사용 합니다.


1

햄스터 솔루션 2 개 :

  • 사전 커밋 후크를 사용하여 코드에서 HAMSTER와 같은 비정상적인 키워드를 확인할 수 있습니다. 사람들이 해킹당한 코드를 커밋하지 말고 더러운 해킹을 할 때마다 사용하십시오.

  • 예를 들어 C에서 또 다른 옵션은 #ifdef HAMSTER를 사용하는 것입니다. 그러면 코드는 컴파일러 플래그 HAMSTER가있는 시스템에서만 실행됩니다.


0

우리 는 현재 바이너리 를 빌드 하고 테스트 하는 데 필요한 모든 것을 소스 제어하에두고 사물이 원래대로 설계 / 구현 / 테스트 되었는지 이해했습니다 .

그것은 심지어 당신이 묘사 한 것과 같은 스파이크 http://www.extremeprogramming.org/rules/spike.html을 보유합니다 . 다른 하위 트리에서 호스팅합니다.


0

다음은 다양한 상황에서 때때로 사용하는 여러 가지 솔루션입니다. 자신의 워크 플로에 적용 할 때 도움이 될 수 있습니다.

  1. 찌그러 질 수있는 가벼운 가지.

    힘내 이것에 위대하다. 지점을 해킹하고 커밋을 많이 한 다음 기록을 리베이스하거나 스쿼시하여 노이즈를 편집하십시오.

  2. SCM 위에 패치 대기열을 사용하십시오.

    나는 종종 StGit 을 사용하여 패치를 현재 브랜치 상단에 띄웁니다 . 분기가 끝나면 병합, 스쿼시 또는 리베이스하기 전에 스택에서 다시 튀어 나오거나 유지하려면 기본 코드베이스로 병합 할 수 있습니다.

  3. 소규모 실험에서는 RCS 를 "대역 외"SCM으로 사용하십시오 .

    때로는 나중에 기록을 정리하지 않고 일회용 파일로 진행중인 파일을 체크 포인트하려고합니다. 나는 일반적으로 Git 또는 SVN 내부에서 RCS를 사용합니다. 나는 Git에게 RCS 아티팩트를 무시하고 RCS에서 진행중인 작업을 체크 포인트하고 결과를 좋아할 때 *,v파일이나 전체 RCS 디렉토리를 던져 버린다 . git clean -fdx작업을 "실제"SCM에 맡길 때까지 실행 하거나 이와 유사한 작업을 수행하지 않으면 후회하게됩니다.

  4. 이름이 숨겨져 있습니다.

    또 다른 Git-ism이지만 편리합니다. git stash save --include-untracked <some-cool-title>꼬집음에 유용 할 수 있습니다. 당신은 저장, 팝,이 방법을 진행중인 작업을 적용하고,을 통해 다양한 체크 포인트를 볼 수 있습니다 git stash list또는 git reflog --all. 다른 SCM의 기능은 비슷하지만 마일리지가이 기능에 따라 크게 다를 수 있습니다.


0

그 임시 코드 중 일부는 실제로 부적절한 빌드 / 테스트 / 개발 방법론의 표현 일 뿐이며, 그 존재가 미래의 개선에 동기를 부여하기를 바랍니다.

적어도 자식에서는 마스터 / 트렁크에 병합 될 준비가 될 때까지 여러 가지 기능 분기를 자유롭게 엉망으로 만들어야합니다.

버전 관리는 당신 에게 도움 이되며 과거에 실수 (또는 직관이 아닌 결정)가 이루어진 방식에 대한 통찰력에 감사하고 현재에 대한보다 현명한 결정을 내립니다.


0

일부 시스템은 주석에서 TODO를 볼 때 경고 메시지를 표시하므로

// TODO: remove this hack.

개발 환경의 일부에서 관련 옵션을 찾거나 빌드 파일에 grep 명령을 붙이면 필요한 모든 것입니다. 또한 // HACK임의의 문자열을 가져 오도록 정렬 할 수도 있습니다 .

이것은 특정 방식으로 코드를 구성하고 사람들이 코드를 사용하지 않는 것을 기억하기를 희망하는 것보다 간단합니다. 또한 @gbjbaanb의 조언을 따르는 것이 더 안전합니다 (모든 사람이 경고를 볼 수 있다면!).

언젠가는 당신이 무엇을보고 싶을 지에 대한 모든 것을 고수하십시오. 그리고 당신의 SCM이 진정 무엇에 관한 것인지 깨닫는 날들입니다.


0

소스 제어에 코드를 넣는 것은 결코 해롭지 않습니다.

언급 한 모든 항목 중 하나가 소스 제어에 있어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.