문제

우리 조직이 Subversion과 같은 중앙 서버 VCS에서 git과 같은 분산 VCS로 전환하는 경우 내 모든 코드가 하드웨어 오류로부터 안전한지 어떻게 확인할 수 있나요?

중앙 서버 VCS를 사용하면 매일 저장소를 백업하면 됩니다.DVCS를 사용한다면 모든 개발자 컴퓨터에 수많은 코드 분기가 있을 것이고, 해당 하드웨어가 고장나거나 개발자가 노트북을 분실하거나 도난당한 경우 백업이 전혀 없을 것입니다. .

"개발자가 분기를 서버에 푸시하도록 하는" 것은 좋은 옵션이 아니라고 생각합니다. 지루한 그러면 개발자들은 결국 그렇게 하지 않을 것입니다.

이 문제를 해결할 수 있는 일반적인 방법이 있나요?

몇 가지 설명:

기본 중앙 서버 VCS를 사용하면 모든 것 개발자의 최신 변경 사항을 제외하고는 중앙 서버에 있어야 합니다.예를 들어 개발자가 버그 수정을 위해 분기하기로 결정한 경우 해당 분기는 중앙 서버에 있으며 즉시 백업할 수 있습니다.

DVCS를 사용하는 경우 개발자는 로컬 분기(실제로는 많은 로컬 분기)를 수행할 수 있습니다.개발자가 "아, 중앙 서버에 푸시해야지"라고 생각할 때까지 이러한 분기 중 어느 것도 중앙 서버에 없고 백업에 사용할 수 없습니다.

그래서 내가 보고 있는 차이점은 다음과 같습니다(틀렸다면 정정해 주세요!).DVCS를 사용하는 경우 절반만 구현된 기능과 버그 수정을 중앙 서버에서 백업할 수 없지만 일반 VCS에서는 사용할 수 있습니다.해당 코드를 어떻게 안전하게 유지합니까?

도움이 되었습니까?

해결책

실제로 개발자들은 서로의 로컬 저장소 사이를 밀고 당기는 것보다 중앙 저장소를 사용하는 것을 선호할 것이라고 생각합니다.중앙 저장소를 복제한 후 추적 분기에서 작업하는 동안 가져오기 및 푸시는 간단한 명령입니다.모든 동료의 로컬 저장소에 6개의 리모콘을 추가하는 것은 고통스러운 일이며 이러한 저장소에 항상 액세스할 수 있는 것은 아닙니다(전원을 끄거나 집에 가져간 노트북에서 등).

모두가 동일한 프로젝트에서 작업하는 경우 모든 작업을 통합해야 하는 시점이 있습니다.이는 모든 변경 사항이 함께 모이는 통합 분기가 필요함을 의미합니다.이는 당연히 모든 개발자가 액세스할 수 있는 어딘가에 있어야 하며, 예를 들어 수석 개발자의 노트북에 속하지 않습니다.

중앙 저장소를 설정한 후에는 cvs/svn 스타일 워크플로를 사용하여 체크인하고 업데이트할 수 있습니다.cvs 업데이트는 로컬 변경 사항이 있는 경우 git fetch 및 rebase가 되고, 그렇지 않은 경우 git pull이 됩니다.cvs 커밋은 git commit 및 git push가 됩니다.

이 설정을 사용하면 완전히 중앙 집중화된 VCS 시스템과 유사한 위치에 있게 됩니다.개발자가 나머지 팀에게 표시되기 위해 수행해야 하는 변경 사항(git push)을 제출하면 해당 변경 사항은 중앙 서버에 있으며 백업됩니다.

두 경우 모두 규율이 필요한 것은 개발자가 중앙 저장소에서 장기간 실행되는 변경 사항을 유지하지 못하게 하는 것입니다.우리 대부분은 아마도 한 개발자가 일부 핵심 코드에 근본적인 변화가 필요한 'x' 기능을 작업하는 상황에서 일해 본 적이 있을 것입니다.변경으로 인해 다른 모든 사람이 완전히 다시 빌드해야 하지만 기능은 아직 메인 스트림에 준비되지 않았으므로 적절한 시점까지 체크아웃 상태를 유지합니다.

실제적인 차이점이 있지만 상황은 두 상황 모두 매우 유사합니다.git을 사용하면 로컬 커밋을 수행하고 로컬 기록을 관리할 수 있기 때문에 개별 개발자는 cvs와 같이 중앙 저장소로 푸시해야 할 필요성을 덜 느낄 수 있습니다.

반면에 로컬 커밋을 사용하면 이점을 얻을 수 있습니다.모든 로컬 커밋을 중앙 저장소의 안전한 위치로 푸시하는 것은 그리 어렵지 않습니다.로컬 브랜치는 개발자별 태그 네임스페이스에 저장될 수 있습니다.

예를 들어 Joe Bloggs의 경우 로컬 저장소에 별칭을 만들어 다음에 대한 응답으로 다음과 같은 작업을 수행할 수 있습니다. git mybackup.

git push origin +refs/heads/*:refs/jbloggs/*

이는 모든 로컬 변경 사항이 안전하게 백업되었는지 확인하기 위해 언제든지(예: 하루의 끝) 사용할 수 있는 단일 명령입니다.

이는 모든 종류의 재난에 도움이 됩니다.Joe의 컴퓨터가 고장나면 다른 컴퓨터를 사용하여 저장된 커밋을 가져와서 중단한 부분부터 계속할 수 있습니다.조는 아픈가?Fred는 어제 작성했지만 마스터에 대해 테스트할 기회가 없었던 '필수' 수정 사항을 가져오기 위해 Joe의 브랜치를 가져올 수 있습니다.

원래 질문으로 돌아가려면.dVCS와 중앙 집중식 VCS 간에 차이가 있어야 합니까?dVCS의 경우 절반만 구현된 기능과 버그 수정이 중앙 저장소에 저장되지 않을 것이라고 말씀하셨지만 저는 차이가 없다고 주장합니다.

중앙 집중식 VCS를 사용할 때 절반만 구현된 기능이 하나의 개발자 작업 상자에 남아 있는 경우를 많이 보았습니다.절반만 작성된 기능을 메인 스트림에 체크인하도록 허용하는 정책을 취하거나 중앙 분기를 생성하기 위한 결정을 내려야 합니다.

dVCS에서도 동일한 일이 발생할 수 있지만 동일한 결정을 내려야 합니다.중요하지만 완료되지 않은 작업이 있는 경우 중앙에 저장해야 합니다.git의 장점은 이 중앙 브랜치를 만드는 것이 거의 간단하다는 것입니다.

다른 팁

분산형 VCS를 사용한다는 것은 반드시 오류라고 생각합니다. ~ 해야 하다 완전히 분산된 방식으로 사용하세요.공통 Git 저장소를 설정하고 모든 사람에게 해당 저장소가 공식 저장소임을 알리는 것은 완전히 유효합니다.일반적인 개발 워크플로의 경우 개발자는 공통 저장소에서 변경 사항을 가져와 자신의 저장소를 업데이트합니다.두 명의 개발자가 특정 기능에 대해 적극적으로 협력하는 경우에만 서로에게서 직접 변경 사항을 가져와야 할 수도 있습니다.

여러 명의 개발자가 프로젝트를 진행하는 경우 다른 모든 사람의 변경 사항을 가져와야 한다는 사실을 기억해야 한다는 것은 매우 지루한 일입니다.당신이라면 어떻게 하시겠습니까? 하지 않았다 중앙 저장소가 있나요?

직장에는 매일 모든 사람의 작업 디렉터리를 백업하고 매주 DVD에 전체 내용을 기록하는 백업 솔루션이 있습니다.따라서 중앙 저장소가 있더라도 각 개별 저장소도 백업됩니다.

백업을 수행할 장소를 제공하는 DVCS의 권한으로 "중앙" 서버를 사용하는 것은 드문 일이 아닙니다.

나는 이 질문이 조금 이상하다고 생각한다.CVS와 같은 비분산 버전 제어 시스템을 사용한다고 가정하면 중앙 서버에 저장소가 있고 개발자 서버에서 작업이 진행됩니다.저장소를 어떻게 백업합니까?진행 중인 개발자 작업을 어떻게 백업하시나요?이러한 질문에 대한 대답은 바로 귀하의 질문을 처리하기 위해 수행해야 하는 작업입니다.

분산 버전 제어를 사용하면 개발자 서버의 리포지토리가 진행 중입니다.백업하시겠습니까?그런 다음 백업하세요!그만큼 간단합니다.

우리는 우리 머신에서 우리가 지정한 모든 디렉토리를 가져오는 자동화된 백업 시스템을 가지고 있으므로 git 및 CVS 리포지토리를 포함하여 내 머신의 모든 리포지토리와 작업 복사본을 마지막에 추가합니다.

그런데 제품을 출시하는 회사에서 분산 버전 관리를 사용하고 있다면 ~ 할 것이다 중앙 저장소가 있습니다.그것은 당신이 풀어 놓은 것입니다.특별한 서버에 있지 않을 수도 있습니다.일부 개발자의 하드 드라이브에 있을 수도 있습니다.그러나 릴리스하는 저장소는 중앙 저장소입니다.(아직 출시하지 않았다면 아직 없을 수도 있습니다.) 모든 프로젝트에는 하나 이상의 중앙 저장소가 있다고 생각합니다.(실제로 두 개 이상의 프로젝트가 있는 경우 두 개의 프로젝트이고 하나는 포크입니다.) 이는 오픈 소스에도 적용됩니다.

중앙 저장소가 없더라도 솔루션은 동일합니다.개발자 컴퓨터의 작업을 백업합니다.어쨌든 그렇게 했어야 했어요.진행 중인 작업이 CVS 작업 복사본이나 버전이 지정되지 않은 직접적인 디렉터리 대신 분산 저장소에 있다는 사실은 중요하지 않습니다.

개발자 홈 디렉터리가 로컬 네트워크를 통해 원격 장치를 마운트하도록 할 수 있습니다.그렇다면 네트워크 스토리지를 안전하게 만드는 것만 걱정하시면 됩니다.아니면 다음과 같은 것을 사용할 수도 있습니다. 드롭 박스 로컬 저장소를 다른 곳으로 원활하게 복사합니다.

팀의 모든 개발자는 서버에 자체 분기를 가질 수도 있습니다(티켓별 또는 개발자별 등 가능).이렇게 하면 마스터 브랜치의 빌드가 중단되지 않지만 여전히 진행 중인 작업을 백업되는 서버로 푸시할 수 있습니다.

내 자신의 git_remote_branch 도구는 그러한 종류의 작업 흐름에 유용할 수 있습니다(Ruby가 필요하다는 점에 유의하세요).원격 지점을 조작하는 데 도움이 됩니다.

참고로 repo 안전에 대해 이야기하면 서버에서 간단한 git clone 또는 git push를 다른 시스템으로 수행하는 커밋 후 후크를 설정할 수 있습니다.커밋할 때마다 최신 백업을 받을 수 있습니다!

우리는 rsync를 사용하여 개별 개발자의 .git 디렉터리를 서버의 디렉터리에 백업합니다.이는 git clone 주변의 래퍼 스크립트와 사후 커밋 등을 사용하여 설정됩니다.후크.

post-* 후크에서 수행되므로 개발자는 수동으로 수행해야 한다는 것을 기억할 필요가 없습니다.그리고 시간 초과와 함께 rsync를 사용하기 때문에 서버가 다운되거나 사용자가 원격으로 작업하는 경우에도 계속 작업할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top