다른 저장소 내에서 git 저장소를 어떻게 사용합니까?


284

다양한 프로젝트에서 사용할 JavaScript 및 CSS 마스터 파일과 스크립트를 모두 유지하는 Git 미디어 저장소가 있습니다.

자체 Git 리포지토리에있는 새 프로젝트를 만드는 경우 새 프로젝트의 미디어 리포지토리에서 JavaScript 파일을 사용하는 방법으로 변경하면 스크립트의 두 복사본을 업데이트하지 않아도되는 방법 ?


아래 @ ruslan-kabalin 의 하위 트리 답변을 참조하십시오 . 참고 : 사전 커밋 (또는 오버 커밋 ) 후크는
Hedgehog가

답변:


348

핵심은 자식 서브 모듈 입니다.

Git 커뮤니티 북 또는 사용자 매뉴얼 의 서브 모듈 장을 읽기 시작하십시오

PROJECT1, PROJECT2 및 MEDIA 저장소가 있다고 가정하십시오 ...

cd /path/to/PROJECT1
git submodule add ssh://path.to.repo/MEDIA
git commit -m "Added Media submodule"

다른 리포지토리에서 반복하십시오 ...

이제 멋진 점은 MEDIA에 대한 변경 사항을 커밋 할 때마다 다음과 같이 할 수 있다는 것입니다.

cd /path/to/PROJECT2/MEDIA
git pull
cd ..
git add MEDIA
git commit -m "Upgraded media to version XYZ"

이것은 방금 PROINECT2의 MEDIA 서브 모듈이 이제 XYZ 버전이라는 사실을 기록했습니다.

각 프로젝트가 사용하는 MEDIA 버전을 100 % 제어 할 수 있습니다. 자식 서브 모듈 은 훌륭하지만 실험하고 그것에 대해 배워야합니다.

큰 힘으로 엉덩이에 물릴 수있는 좋은 기회가옵니다.


이 워크 플로는 개인 NPM 모듈 사용을 상기시킵니다. stackoverflow.com/questions/7575627/…
cyrf

기본값을 최신 버전으로 사용하려면 MEDIA 커밋을 모든 종속 프로젝트에 전파하는 스크립트를 추가 할 수 있습니다.
jiggunjer

3
이것이 github와 어떻게 통합됩니까?
theonlygusti

27

하위 모듈 대신 하위 트리 를 사용하면 repo 사용자의 삶이 훨씬 쉬워집니다. 자세한 내용은 Pro Git book을 참조하십시오 .


6
다음은 하위 트리 대 서브 모듈의 다른 유익한 기사입니다 blogs.atlassian.com/2013/05/...
베니 노이게 바우어

3
이 기사에 따르면 단점 중 하나는 다음과 같습니다.> 커밋에서 수퍼 및 하위 프로젝트 코드를 혼합하지 않는 책임은 귀하에게 있습니다. 누구도
그럴

20

문제를 잘 이해하면 다음을 원합니다.

  1. 많은 프로젝트에서 사용되는 하나의 git 저장소에 미디어 파일을 저장하십시오.
  2. 로컬 컴퓨터의 프로젝트에서 미디어 파일을 수정하면 다른 모든 프로젝트에 즉시 미디어 파일이 나타나야합니다 (따라서 커밋 + 푸시 + 풀을 원하지는 않습니다)

불행히도 원하는 것에 대한 궁극적 인 해결책은 없지만 인생을 더 쉽게 만들 수있는 몇 가지가 있습니다.

먼저 중요한 한 가지를 결정해야합니다. 미디어 파일의 버전에 대한 참조를 프로젝트 저장소의 모든 버전에 저장 하시겠습니까? 예를 들어 example.com이라는 프로젝트가있는 경우 2 주 전에 어떤 style.css를 사용 했습니까, 아니면 최신 버전이 항상 (또는 대부분) 가장 좋은지 알아야합니까?

그것을 알 필요가 없다면 해결책은 쉽습니다.

  1. 미디어 파일 용 저장소와 각 프로젝트마다 하나씩 저장소를 작성하십시오.
  2. 프로젝트에서 로컬로 복제 된 미디어 저장소를 가리키는 심볼릭 링크를 만듭니다. 상대 심볼릭 링크 (예 : ../media)를 만들고 모든 사람이 미디어 디렉토리가 같은 위치에 있도록 프로젝트를 체크 아웃한다고 가정하거나 심볼릭 링크의 이름을 .gitignore에 쓰면 누구나 결정할 수 있습니다. 미디어 파일을 넣는 위치

그러나 대부분의 경우이 버전 정보를 알고 싶습니다. 이 경우 두 가지 선택이 있습니다.

  1. 모든 프로젝트를 하나의 큰 저장소에 저장하십시오. 이 솔루션의 장점은 미디어 저장소의 사본이 하나만 있다는 것입니다. 가장 큰 단점은 프로젝트 버전간에 전환하기가 훨씬 어렵다는 것입니다 (다른 버전으로 체크 아웃하면 항상 모든 프로젝트를 수정 함)

  2. 서브 모듈을 사용하십시오 (답변 1에 설명 된대로). 이 방법으로 미디어 파일을 하나의 저장소에 저장하고 프로젝트에는 특정 미디어 저장소 버전에 대한 참조 만 포함됩니다. 그러나이 방법으로 보통 미디어 저장소의 많은 로컬 사본이 있으며 모든 프로젝트에서 미디어 파일을 쉽게 수정할 수는 없습니다.

내가 당신이라면 아마 첫 번째 또는 세 번째 솔루션 (기호 링크 또는 하위 모듈)을 선택했을 것입니다. 하위 모듈을 사용하기로 선택하면 인생을 더 쉽게하기 위해 많은 일을 할 수 있습니다.

  1. 커밋하기 전에 서브 모듈 디렉토리의 이름을 바꾸고 공통 미디어 디렉토리에 심볼릭 링크를 넣을 수 있습니다. 커밋 할 준비가되면 심볼릭 링크를 제거하고 하위 모듈을 다시 제거한 다음 커밋 할 수 있습니다.

  2. 미디어 저장소 사본 중 하나를 모든 프로젝트에 대한 원격 저장소로 추가 할 수 있습니다.

이 방법으로 로컬 디렉토리를 원격으로 추가 할 수 있습니다.

cd /my/project2/media
git remote add project1 /my/project1/media

/ my / project1 / media에서 파일을 수정하면 파일을 커밋하여 원격 서버로 푸시하지 않고 / my / project2 / media에서 가져올 수 있습니다.

cd /my/project1/media
git commit -a -m "message"
cd /my/project2/media
git pull project1 master

다른 사용자와 공유하지 않았기 때문에 나중에 커밋을 제거 할 수 있습니다 (git reset 사용).


1
아파치의 내부에서 작동 웹 관련 프로젝트 www폴더, 당신은 배치해야 .htaccess하나의 루트에 파일 www과 폴더 또는 프로젝트의 Options +FollowSymLinks더 나은 아직 거기에, 또는 <IfModule mod_rewrite.c>{new line}Options +FollowSymLinks{new line}RewriteEngine on{new line}</IfModule> (대신 {new line}실제 새로운 line`로)

3

서브 트리와 서브 모듈에 문제가 있었는데, 다른 답변에서 제안하는 것은 ... 주로 SourceTree를 사용하고 있기 때문에 상당히 버그가있는 것 같습니다.

대신 SymLinks를 사용하여 정상적으로 작동하는 것 같으므로 가능한 대안으로 여기에 게시하고 있습니다.

여기에 완전한 가이드가 있습니다 : http://www.howtogeek.com/howto/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/

그러나 기본적으로 관리자 권한 명령 프롬프트에서 두 경로를 mklink하면됩니다. / J 하드 링크 접두사를 사용해야합니다. mklink / JC : \ projects \ MainProject \ plugins C : \ projects \ SomePlugin

상대 폴더 경로를 사용하여 프로젝트를 처음 체크 아웃 할 때 각 사람이 실행할 수 있도록 박쥐에 넣을 수도 있습니다.

예 : mklink / J. \ Assets \ TaqtileTools .. \ TaqtileHoloTools

폴더가 연결되면이를 참조하는 기본 저장소 내의 폴더를 무시해야 할 수도 있습니다. 그렇지 않으면 갈 수 있습니다.

참고 해당 게시물이이 게시물에 대한 중복 질문으로 표시되어 다른 게시물에서 중복 답변을 삭제했습니다.

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