2013-10-08 12 views
3

[*]에 익숙한 대부분의 버전 제어 도구 및 CVS, SVN, git, Mercurial, Bazaar - 디렉토리 트리에 일종의 "마커"가 있습니다.ISO VC 도구로 관리되는 것으로 표시된 디렉터리 트리 아래에 있지 않은 파일을 관리 할 수있는 버전 제어 도구

예. 버전 제어 파일 /a/b/c/file.txt을 원할 경우 트리의 일부 레벨에 저장소를 설정합니다 (예 :

/a/b/.bzr 
/a/b/.git 
/a/b/.hg 
/a/b/CVS 

DVCSes의 대부분은 실제로 "마커"의 버전 기록을 저장합니다. CVS는 그렇지 않습니다 - CVS 디렉토리에는 실제 저장소 (기본적으로 심볼릭 링크 또는 하드 링크는 아니지만 링크)로가는 방법을 알려주는 파일이 있습니다. 또한 CVS는 작업 트리의 모든 하위 디렉토리에 링크 "CVS"디렉토리를두고 그 디렉토리를 일부 저장소의 해당 위치에 연결합니다. (반드시 같을 필요는 없습니다.)

Q : 파일 시스템에 이러한 링크 나 마커가 필요없는 최신 DVCS 도구가 있습니까?

예. 버전 제어에서 파일을

/a/b/c/file.txt 

하지만 {A/B/C/file.txt를}이 부분은 반드시 디렉토리 경로가 아닌 곳 저장소는

/x/y/z/repo/.DVCS-TOOL/{a/b/c/file.txt} 

에 있지만 가능 항목 데이터베이스에서.

당신이 저장소 내부에서 다음과 같은 일을 할 수 있도록 :

> cd /x/y/z/repo 
> DVCS-TOOL add /a/b/c/file.text 
Warning: /a/b/c/file.txt is not under the repository /x/y/z. 
Are you sure that you want to add such an outside-repository file? [y/n] y 
Absolute or relative path? [ar] a 
> DVCS-TOOL ci 
/a/b/c/file.text --ci--> /x/y/z/repo/.DVCS-TOOL/{a/b/c/file.txt} 
> rm /a/b/c/file.txt 
> DVCS-TOOL status 
Missing /a/b/c/file.text --in-repo-as--> /x/y/z/repo/.DVCS-TOOL/{a/b/c/file.txt} 
> DVCS-TOOL revert 
/a/b/c/file.text <--reverted-from-- /x/y/z/repo/.DVCS-TOOL/{a/b/c/file.txt} 
> echo 'stuff' >> /a/b/c/file.txt 
> DVCS-TOOL ci 
/a/b/c/file.text --ci--> /x/y/z/repo/.DVCS-TOOL/{a/b/c/file.txt} 

과의 repo 외부에서

, 당신은 할 수 있습니다

> cd /a/b/c 
> echo 'more stuff' >> file.txt 
> DVCS-TOOL -repo /x/y/z/repo ci 
/a/b/c/file.text --ci--> /x/y/z/repo/.DVCS-TOOL/{a/b/c/file.txt} 

동기 부여 :

I 버전을 내 홈 디렉토리를 제어하고 Linux, Cygwin 또는 Windows와 같은 다른 시스템을 변경합니다.

물론, cygwin /을 관리 할 수 ​​있습니다. 따라서 /etc/bash.bashrc/usr/local/etc/foo.rc과 같은 파일에 대한 변경 사항을 원래대로 체크인 할 수 있습니다. 예 : /.bzr을 만들 수 있습니다. (종종 전체 트리가 아닌 배포판을 검색 할 수있는 특정 파일 만 검사합니다.)

나는 소유하고있는 UNIX/Linux 시스템에서이 작업을 수행 할 수 있습니다.

하지만 /에 대한 쓰기 권한을 가지고 있지만 /usr/etc/foo/bar/etc/baz/bif을 어떻게 ... 그리고 두 개의 별도의 repos을하고 싶지 않지만, 대신 "스파 스 REPO"을하지 않으려면.

아니면 언제든지 멀리 /cygwin를 날려 버릴 수 있도록하려면,하지만 여전히 (다른 시스템에서 /etc/bash.bashrc을 가능하게하고, 지옥) /cygwin/etc/bash.bashrc/a/b/my-repo/{cygwin/etc/bash.bashrc}에서 편리 매핑이

을 또는 경우, 윈도우 오늘 우연히 예 : 나는

C:\Users\[USERNAME]\AppData\Roaming\Adobe\FrameMaker\11\Maker.ini 

또는 Cygwin에서 경로와 같은 버전 관리 파일을 원하는

/cygdrive/c/Users/glew/AppData/Roaming/Adobe/FrameMaker/7.2/maker.ini 

그러나 나는 C에서의 repo 만들지 않으 : .hg 또는 C : 사용자 \ \ glew.hg 나 ... 난 그냥 하나 개의 repo를 갖고 싶어

을 and./or 작업 공간 기반 해당 repo에 연결되거나, repo/workspace 아래에 있지 않은 대상 파일을 처리하는 방법을 알고있는 명령.

Q : 이것을 수행하는 최신 DVCS 도구에 대해 알고 계십니까?

Q : 그렇다면 어떻게됩니까?

예. 내가 막연하게 bzr이 작업 공간에서 repos를 공유 할 수 있다는 것을 알았지 만, AFAIK는 여전히 작업 공간을 repo에 연결하는 /a/b/workspace/.bzr 파일이어야합니다. 그래서 "바자를 보아라"보다 더 자세한 내용이 필요합니다.

예. hg에는 --repository 옵션이 있다는 것을 알고 있습니다. 하지만 내가하고 싶은 일을하지 않습니다

> cd /tmp 
> mkdir tmp1; cd tmp1 
./tmp1 
> hg init 
> cd .. 
> mkdir tmp2; cd tmp2 
./tmp2 
> bar.txt 
> hg --repository ../tmp1 add bar.txt 
abort: bar.txt not under root '/tmp/tmp1' 

참고 * : 내가 말하는 이유는 "나는 익숙 버전 관리 도구의 대부분, 그리고 현대적인 도구의 모든 ..."입니다 "박스, 링크 및 병렬 트리 : 구성 관리 시스템의 요소"에 설명 된 도구 워크샵 Proceedings of the Software Management Conference에서. 1989.

은 그러한 특징이있다. 또는, 오히려, 그러한 기능을했다.

나는 당황스럽게도 저자입니다. 그러나 아니, 정말로, 나는 자아 만족을 위해이 질문을하지 않았다. 나는이 질문을 쓰기 시작할 때이 종이를 잊어 버렸다.

또한이 백서에 설명 된 도구는 오래되고 오래 전에 사라졌으며 몇 년 전이나 몇 년 전에 고용주에게 남겨졌습니다. 그리고 확실히 현대 DVCS가 아닙니다.

예, 알고 있습니다. Brian Berliner가 자신의 CVS 논문에서 제 논문을 모욕합니다. 그는 틀렸고 나도 옳았지 만 또 다른 문제입니다. (Brian은 라이브 록의 가능성에 만족하고 있습니다.)

어쨌든, 저는 저장소와 저장소 외부의 파일 간의 매핑이라는 아주 오래된 개념이 현대 DVCS 도구에서 다시 등장하기를 바라고 있습니다. 위에서 설명한대로 사용하고 싶습니다.

+0

아마도 PERFORCE는 스페이드에서 이것을 수행할만한 가치가있을 것입니다. –

답변

4

실제로 힘내에서 할 수 있습니다.

확인이 답변 밖으로 Can I store the .git folder outside the files I want tracked?

은 기본적으로 당신은 당신이 그 자식 코어를 설정 원하는 어디든지 .git 폴더를 만듭니다.worktree config를 버전 관리해야하는 디렉토리에 복사하십시오.

git help config에는 core.worktree 섹션에 많은 정보가 있습니다.

+0

git에 좋을 것 같습니다. 감사. 시험해야합니다. –

+1

'GIT_DIR' 환경 변수도 설정할 수 있습니다. ['man git']의 "환경 변수"섹션 (https://www.kernel.org/pub/software/scm/git/docs/)을보십시오. – mgarciaisaia

+0

망할이 이긴다. 나는 bzr이 이것을 가지고 있었으면 좋겠다. –

0

Bazaar는 기록 데이터가 필요한 작업에 대해 원래 repo와 대화 할 수 있도록 충분한 메타 데이터 만 .bzr 폴더에 넣습니다. 이러한 작업은 당연히 느려질 것이지만 원격 리포지토리의 체크 아웃에도 작동합니다.

+0

그리고 내 요점은 체크 아웃 된 파일을 보유하고있는 디렉토리 트리에 .bzr 파일을 갖고 싶지 않다는 것입니다 (주의 깊게 "체크 아웃 된 파일을 보유하고있는 디렉토리 - 전체 디렉토리가 아닐 수도 있습니다 tree). –

-1

Bazaar, Fossil 및 Monotone은 이러한 유형의 작업을 기본적으로 지원합니다. Bazaar의 경우 체크 아웃 (lightweight 또는 normal)을 사용합니다 (일반 체크 아웃은 .bzr에 좀 더 많은 메타 정보를 저장합니다). 화석의 경우, 화석 데이터베이스를 어딘가에두고 다른 곳에 "화석 열어"를 사용하십시오. 단조를위한 동등한 것.

해트 core.worktree (저장소 당 하나의 작업 트리 만 유지하거나 스크립트를 사용하여 전환하는 경우) 또는 git-new-worktree을 기반으로 한 스크립트를 사용하여 어느 정도까지 행동 할 수 있습니다. (나는 당신이 서브 모듈을 사용하지 않는 한 여전히 작동한다고 생각한다).

Mercurial의 경우 share extension을 사용하여 파일 시스템의 다른 부분에있는 저장소에 액세스 할 수 있습니다.

+0

필자는 문제가되는 버전 제어 파일이있는 디렉토리에 .bzr 또는 .hg를 사용하지 않기를 바란다.이 파일이 Mercurial의 공유 확장이 아닌 것이 합리적으로 확실하다 .git의 core.worktree는 원한다면 Bazaar와 비슷한 것이 있는지 확인해야한다. 화석 : Monotone은 여전히 ​​살아 있는가? –

+0

.bzr 디렉토리는 CVS 디렉토리와 같이 실제 저장소와 디렉토리 상태를 역 참조 한 것이다. . 화석의 .fslckout 파일도 마찬가지다. 저장소마다 하나 이상의 체크 아웃을 유지하는 것만으로도 충분하며, 각 저장소마다 최대 하나의 체크 아웃 만 있으면 git 's co 레.worktree는 최소한의 관여 옵션이 될 것입니다 (그렇지만 명시 적으로 각 작업에 대해 git 디렉토리를 지정해야합니다). –

+0

강조 : 나는 CVS 디렉토리에 좋지 않다. 그들은 파일 시스템에서 똑같이 나쁜 똥입니다. CVS 디렉토리와 그와 관련된 파일은 더 많은 장소에서 더 작은 똥입니다. 반면 .git와 .bzr 지시어는 나무의 뿌리에있는 단일 장소에서 큰 똥입니다. –

1

ssmith answered 헤드 라인 요청이지만, 동기 부여를 읽는 것은 나에게 정말 힘든 일을 깊이 파고들 것을 권하고 싶다. "Full access to internals"은 어두운 곳이 아니며, 빌드 할 수있는 라이센스입니다.

gitcore tutorial에 2 팩의 팝콘을 흡입하지 않을 수도있는 삶의 독서 설명서를 충분히 보냈습니다. 나는 git update-index을 소개 한 직후에 git ls-files -s을 사냥하는 것이 좋을 것입니다. 간단히 말하면 그것은 완전히 완전한 색인 덤프이기 때문입니다. 기본 설정에 cruft가 있기 때문에 git init이 아닌
git init --template=/dev/null을 사용하는 것이 좋습니다. 계속 진행하면서 find -type f을 자유롭게하는 것. bemusement를 완료하려면 .git/objects에 나타나는 파일을 zlib의 examples/zpipe.ccat -A을 통해 파이프하십시오.

모든 노력을 연구하면 좋은 하루를 계획하여 원하는대로 만들 수 있습니다.

+0

고마워, 나는 자식에 대한 의미가있다. 다른 이유로 (중첩 된 나무/부분적인 계산 /). 그러나 나는 "자식이 내 눈알을 피로하게한다"는 것을 인정할 것이다. 게다가, 현재의 환경에서는 Perl이나 Python과 같은 해석 언어로 작성된 도구가 C를 능가합니다. –