2009-04-15 9 views
44

(Windows) 네트워크 공유에 저장된 저장소가 필요합니다. 나는 리눅스를 사용하고 CIFS로 마운트 된 네트워크 공유를 가지고있다. 내 동료는 Windows xp를 사용하고 네트워크 드라이브를 네트워크 드라이브로 자동 할당합니다 (ActiveDirectory에서 어떻게 든).네트워크 공유 폴더에있는 GIT 저장소의 동시성

동시성 문제없이 두 컴퓨터의 repo를 사용할 수 있는지 궁금합니다.

나는 이미 테스트를 마쳤으며, 결국은 복제를 할 수 있지만, 같은 repo (push/pull)를 동시에 사용하면 어떤 일이 벌어 질지 걱정된다.

git FAQ에는 네트워크 파일 시스템 (및 SMBFS의 일부 문제)에 대한 참조가 있지만 네트워크/서버/Windows/Linux에서 잠긴 파일이 있는지 확실하지 않습니다. 확실히 거기 없다.

그래서, 서버없이 네트워크 공유에 아무런 문제없이 git repo를 사용하는 사람이 있습니까?


알렉스에게,

PS 감사 : 나는 주식으로 서버에 액세스 할 수 없기 때문에, HTTP 서버 (또는 자식 - 데몬)을 사용하지 않도록합니다. 또한 우리는 하나에서 다른 것으로 밀어 넣을 수는 있지만 백업을 위해 공유에 코드/저장소가 있어야합니다.

업데이트 :

내 걱정은 네트워크 오류의 가능성에 대해 수 없습니다. 그럼에도 불구하고, 우리는 필요한 브랜치를 로컬에 갖게 될 것이고 소스를 컴파일 할 수있게 될 것입니다.

그러나 우리는 대개 매우 자주 커밋하고 자주 리베이스/병합해야합니다. 필자의 관점에서 볼 때 가장 좋은 옵션은 공유에 중앙 저장소를 두는 것입니다 (백업이 보장되므로). 복제본을 복제하고 리베이스하는 데 사용합니다.

그러나 우리가 종종 이렇게하고 있다는 사실 때문에 파일/repo 손상에 대해 두려워하고 있습니다. 동시에 발생하면 우리는 동시에 밀고 당깁니다. 일반적으로 을 우리는 원격 저장소에 액세스 할 때마다 서로 매핑 할 수 있지만 :) 컴퓨터/네트워크가 보안을 유지하는 것이 좋습니다.

그리고 GIT는 내부 메카니즘을 가지고 있기 때문에 (누군가 당신의 레포지 중 하나를 누를 수 있기 때문에), 아직 결정적인 것을 발견하지 못했습니다.

업데이트 2 :

공유 드라이브에있는 REPO는 작업 복사본을 포함하지 않는하는 베어의 repo 될 것이다.

+3

알렉스 질문에 감사드립니다. 저는 비슷한 상황에 직면하고 있습니다. 매우 도움이되었습니다. 몇 가지 추가 사항 : windows와 linux exe는 네트워크 공유를 통해 동일한 베어 레포에서 작동 할 것이기 때문에 두 버전 모두 동일한 버전의 git을 사용하고 있습니다. 이론적으로 버전간에 약간의 차이가있을 수 있습니다. . 아마도 당신이 염두에 두어야 할 플래그 일 것입니다. –

+0

참조 : http://stackoverflow.com/questions/1489542/are-there-any-concurrency-issues-in-backing-up-git –

+0

(으)로 이동하여 동시 사용자 수를 1로 제한하는 것이 유용 할 수 있습니다. 폴더에 대한 고급 공유 옵션 – Omar

답변

39

힘내는 최소한의 파일 잠금이 필요합니다. 네트워크 파일 시스템에서 이러한 종류의 공유 ​​자원을 사용할 때 문제가 발생하는 주요 원인으로 생각됩니다. Git repo에있는 대부분의 파일 --- 객체 데이터베이스를 구성하는 모든 파일 ---은 내용의 다이제스트로 이름 지어지며 한 번 생성되면 변경되지 않습니다. 그래서 두 개의 클라이언트가 서로 다른 컨텐트에 대해 동일한 파일을 사용하려고하는 문제가 발생하지 않습니다.

오브젝트 데이터베이스의 다른 부분은 더 까다 롭습니다. refs는 "refs"디렉토리 (또는 "packed-refs") 아래의 파일에 저장되며 이들은 변경됩니다. refs/* 파일은 작지만 항상 재 작성되지만 편집되기보다는 오히려. 이 경우, Git은 새 ref를 임시 ".lock"파일에 쓰고 대상 파일의 이름을 바꿉니다. 파일 시스템이 O_EXCL의 의미를 존중하면 안전합니다. 그렇지 않은 경우에도 최악의 상황은 ref 파일을 덮어 쓰는 경쟁 일 수 있습니다. 이 일이 성가신 일이지만 부패를 일으켜서는 안됩니다. 공유 된 repo로 밀어 넣는 경우 일 수 있습니다. 실제로 다른 사람이했던 것처럼 성공한 것처럼 보입니다. 그러나 이것은 단순히 (다른 사람의 커밋을 병합하고) 다시 밀어서 정렬 할 수 있습니다.

요약하자면 repo 손상이 너무 많은 문제라고 여기지 않습니다. 잠금 문제로 인해 문제가 조금 잘못 될 수는 있지만 Git repo의 디자인은 피해를 최소화합니다. .

(면책 조항 :이 모든 이론에서 좋은 소리,하지만 난 REPO의 동시 망치는 NFS하지 CIFS를 통해 그들에게 그것을 밖으로 테스트 만 공유하지했습니다)

+0

감사합니다! 이것과 같은 설명을 듣고 싶었습니다. 나는 그것을 시도 할 것이고, 나쁜 일이 있는지보기 위해, 나는이 질문을 갱신 할 것이다. 좋은 하루 되세요! – Alex

+0

URL을 제공 할 수 있습니까? 더 자세한 내용은 여기를 참조하십시오. 정말 재미 있어요. – knocte

7

왜 귀찮은가요? 힘내는 배포되도록 설계되었습니다. 각 머신에 리파지토리를두고 게시 및 끌어 오기 메커니즘을 사용하여 변경 사항을 전파합니다.

백업을 위해 야간 작업을 실행하여 저장소에 공유를 복사하십시오.

또는 공유에 각각 하나의 저장소를 만들고 그 저장소에서 작업을 수행하지만 서로간에 변경 집합을 가져올 수있는 분산 저장소로 사용할 수 있습니다. 이 방법을 사용하면 네트워크를 통해 지속적으로 액세스하므로 빌드 수행 등의 성능이 저하됩니다.

또는 자신의 컴퓨터에 분산 리포지토리를 보유하고 정기적 인 작업을 실행하여 커밋을 공유의 리포지토리로 푸시합니다.

+0

알렉산드레이의 실제 질문은 분산 된 자연에 관한 것이 아니라 CIFS/windows 공유 실패 (마운트 문제, 연결 끊기 등)로 인해 푸시가 실패하면 어떻게 될지 생각합니다. –

+0

알겠습니다. 요점은, 걱정하는 이유는 무엇입니까? git를 사용하는 방법을 단순히 사용하는 것만으로도 충분하지 않습니다. –

+0

여기 마지막 또는 - 점은 질문에 매우 우아하게 대답합니다. 서로 다른 시간에 각 컴퓨터의 저장소가 자동으로 공유에 푸시되도록하십시오. – supercheetah

-2

마치 중앙 집중식 버전 시스템을 사용하려는 것처럼 들리므로 백업 쿼리가 만족 스럽습니다. 아마도 xxx2git을 사용하여 로컬로 작업 할 수 있습니다.

+0

그 사이에 SVN을 사용하여 우리가 현재하고있는 일입니다.하지만 같은 문제입니다. 서버가 없으며 파일 기반으로 사용하고 있습니다. 이것은 GIT로 전환해야하는 이유 중 하나였습니다. (그리고 우리의 작업과 더 잘 어울리 며 같은 워크 카피에서 다른 지점으로 전환하기 위해) – Alex

5

분명히 중앙 자식의 repo를 사용하여 지원됩니다. 처방 된 대부분의 사용은 ssh 또는 http 액세스를 나타내며 어느 쪽도 repo에 대한 동시 액세스를 피하지 않습니다. 완전히 분산 된 사용법을 사용하는 경우에도 두 명 이상의 공동 작업자가 어디서나 동일한 Repo를 클릭하면이 질문이 발생합니다. 지금까지 아무런 대답도 없었습니다. 자식 (git)의 설계로 브랜치에 N 동시 푸시를 처리 할 수 ​​있습니까?