로컬 (특히 Windows)을 포함하여 git 동작을 어떻게 적용합니까?


13

이 .NET 샵을 svn에서 git로 옮기는 것에 주목하고 스위치를 뒤집기 전에 해결해야 할 부수적 인 문제를 확인했습니다.

내가이 질문에서 특히 묻고있는 것은 줄 끝 집행입니다. 기본적으로 Windows 용 git은 'checkout crlf, commit lf'로 설치됩니다. 이것은 독점적으로 crlf 엔딩으로 구성된 많은 소스에서 작동하지 않습니다.

주어진 지시 사항조차도 올바르게 구성 할 수있는 주어진 개발자를 맹목적으로 신뢰한다는 것을 모르겠습니다. 따라서 다음 중 하나 (또는 ​​둘 다)를 고려하고 있지만 여기 누군가가 다른 길을 갔다면 궁금했습니다.

  • lf 줄 끝 (또는 모든 lf 줄 끝)을 확인하고 해당 이벤트에서 거부하는 사전 커밋 후크입니다.
  • 전역 구성을 '있는 그대로'채우는 개발자에게 배포 된 설치 스크립트입니다.

추신 :이 글을 쓰는 동안 svn에서 git 로의 초기 변환이 기본 방법을 커밋 할 수 있으며 사람들이 기본값을 고수하는 한 완벽하게 진행될 수 있습니다. 기본이 아닌 '있는 그대로'로 git을 설치 한 .NET 상점에서 git을 사용하는 개발자 였으므로 나 자신의 문제도 만들었습니다 (도착하기 전에 모두 롤 기본값으로 설정 됨) . 그래서 저는 여전히 일종의 집행 메커니즘에 기대어 있습니다.


2
사전 수신 후크 서버 측에서는이를 처리 할 수 ​​있어야하며 (크롤링 엔딩을 보장하고 그렇지 않은 경우 실패) 업데이트 후크를 사용하여 사전 병합도 업데이트 할 수 있어야합니다. 어떤 유형의 git 서버를 사용하고 있습니까? 이 작업을 워크 스테이션 측에서 수행해야하는 경우 구성 관리자를 사용하는 것이 좋지만 어렵고 많은 단점이 있습니다. 최후의 수단은 CI에 보풀이되어 사람들이 절차를 따르도록 강요하지 않습니다
Tensibai

1
본인은 Tensibai에 동의하며, 귀하가 선택한 옵션은이 옵션이 얼마나 엄격하게 적용되어야하는지에 따라 결정되어야한다고 덧붙입니다. 엄격한 집행을위한 사전 커밋 후크, 사후 컴플라이언스보고를 위해 보풀 없음.
Dave Swersky

고마워 Dave, 클라이언트 측 / 더 엄격한 집행에 대한 나의 이론적 근거는 그것이 나를 위해 전체적으로 적은 작업을 수반하고 오류를 더 빨리 포착 할 수 있다는 것입니다. 개발자의 워크 스테이션을 CM으로하지는 않지만 개발자 서버는 모두 DSC에 있으므로 추가하는 것이 쉽지 않습니다. 편집 : @ Tensibai도 감사합니다 ... 고객 측에있는 단점에 대해 자세히 설명해 주시겠습니까?
ndarwincorn

1
주로 글로벌 훅 클라이언트 측을 시행하면 결국 엔딩이 필요한 프로젝트 작업을 막을 수 있습니다. 그리고 어떤 식 으로든 설정해야합니다. 모든 사람이 올바른 설정을 따를 것을 확신 할 수는 없습니다. 나는 지금 생각하지 않는 다른 권총이 있다고 확신합니다
Tensibai

문제를 해결하기 위해 무엇을 했습니까?
Newtopian

답변:


6

로컬에서 무언가를 시행하는 방법에 대한 질문에 대답하기 위해 모든 개발자 워크 스테이션의 상태를 관리하고 시행하는 데 많은 노력을 기울이지 않고도 할 수 없으며 개발자는 아마도 개발에서 로컬 관리자 여야한다고 생각합니다. 그렇지 않다면 어쨌든 그 특권을 얻는 방법을 알아내는 데 시간을 할애하기 때문입니다.

분산 버전 제어를 사용할 때 로컬 구성 상태를 신경 쓸 필요가 없기 때문일 수 있습니다. 당신은의 상태에 대해 관심을 가져야 하여 구성. git을 중앙 집중식 버전 제어 시스템으로 사용한다고 가정하면, 기본적으로 모든 사람이 가장 쉬워서 수행하는 방식이기 때문에 "귀하의"구성이 중앙 서버에 저장된 코드의 사본이라고 가정 해 봅시다.

이 경우 crlf / lf 줄 끝을 끊는 병합을 수락해서는 안됩니다. 당신은 다른 클라이언트 시도가 오염 수있는 요청 거부 서버 측 로직을 변경 당신을 밀어 때 시행 그래서 당신 과의 repo를 자신의 잠재적으로 파괴 문체 선택을.


4

우리는 github의 Pull 요청을 사용하여 주요 개발자 또는 마스터 브랜치에 대한 검토 프로세스가 필요합니다. 검토 과정에서 많은 파일에 공백이나 줄 끝 차이가있는 경우 풀 요청을 변경해야한다고 표시하고 풀 요청을 수행하는 개발자 또는 마스터 브랜치의 형식을 따라야합니다.

또한 사용하는 언어와 사용하는 CI 도구에 따라 유용한 도구가 있으며, 빌드 프로세스 또는 풀 요청 단계에서 설정 한 규칙에 따라 코드를 자동으로 포맷 할 수 있습니다. 또한 코드를 일관성있게 유지하고 코드를 커밋 할 때 서식 문제를 최소화하는 데 도움이됩니다.


사용중인 툴링에 대해 자세히 설명 하시겠습니까? 이 작업을 수행하는 데는 여러 가지 방법이 있지만 우리는 우리 자신의 것을 가지고 있지만 실제로는 그렇게 구현하지 않았으므로 어떻게 해결하는지 궁금합니다.
ndarwincorn

1
우리는 typescript, github 및 jenkins를 사용하고 있습니다. Typescript에는 이러한 유형의 환경이 좋습니다.
avi

3

저장소 별 구성 을 사용 하여 저장소별로 사용자 구성 을 대체 할 수 있습니다 . 리포지토리에서 중앙 소스로 간주되면 복제본과 함께 전파되고 로컬 리포지토리를 포함하여 다른 리포지토리로 가져와 로컬 구성을 중앙에서 재정의해야합니다.

중앙 리포지토리의 후크 를 통해 파일 엔딩이 원래 상태인지 확인하고 병합 / 푸시가 거부되지 않으면 거부 할 수 있습니다. 그러나 이러한 후크는 리포지토리로 복제되지 않으며 최소한 직접 리포지토리는 아니지만 중앙 리포지토리에 규칙 만 적용하면되므로 반드시 필요한 것은 아닙니다.

git init 에서 템플릿을 사용 하면 원하는 방식대로 모든 gitignore, gitattributes 등의 파일과 동일하게 repos가 생성되도록 할 수 있습니다.

마지막으로, 귀하의 질문과 직접 ​​관련이없는 것은 svn saavy 팀을 git 기반 워크 플로로 가져 가면 중간에 여분의 저장소에 익숙해지는 데 가장 큰 마찰 지점을 발견했습니다. 이 시각적 큐 시트 는 어느 명령이 어느 부분에 어떤 영향을 미쳤는지 설명하는 데 도움 이된다는 것을 알았 습니다.

이것이 약간 도움이 되었기를 바랍니다.

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