하나의 디렉토리에 두 개의 git 저장소가 있습니까?


86

하나의 디렉토리에 2 개의 git 저장소를 가질 수 있습니까? 나는 생각하지 않을 것이라고 생각했지만 내가 물을 것이라고 생각했습니다. 기본적으로, 작업하는 모든 컴퓨터에서 공통적으로 사용되는 홈 디렉토리 구성 파일 (예 : .emacs)을 확인하고 싶지만 로컬 파일 (예 : .emacs.local)을위한 두 번째 저장소가 있습니다. 기계 별 구성. 내가 생각할 수있는 유일한 방법은 하위 디렉토리에 로컬 구성을두고 기본 git 저장소에서 해당 하위 디렉토리를 무시하는 것입니다. 다른 아이디어가 있습니까?


git subtree일을 끝낼 것입니다.
Syd Pao

너무 많은 파일을 다루지 않는다면 심볼릭 링크 / 접합도 만들 수 있습니다.
thdoan

답변:


37

당신이하는 일을 이해한다면, 당신은 하나의 리포지토리에서 모든 것을 처리 할 수 ​​있습니다. 각 머신에 대해 별도의 브랜치를 사용하고 공통 홈 디렉토리 구성 파일을 포함하는 브랜치를 사용합니다.

리포지토리를 초기화하고 공통 파일을 커밋하여 MASTER 분기의 이름을 Common으로 바꿉니다. 그런 다음 작업하는 각 시스템에 대해 별도의 분기를 만들고 해당 분기에 시스템 별 파일을 커밋합니다. 공통 파일을 변경할 때마다 공통 분기를 각 시스템 분기에 병합하고 다른 시스템에 푸시하십시오 (많은 경우 해당 스크립트 작성).

그런 다음 각 컴퓨터에서 해당 컴퓨터의 분기를 확인합니다. 여기에는 공통 구성 파일도 포함됩니다.


하위 모듈도 작동하지만 이것이 저에게 가장 좋은 접근 방식이라고 생각합니다. 로컬 파일은 템플릿을 따르며 MASTER 브랜치의 템플릿을 변경하면이를 머신 로컬 브랜치에 병합하여 로컬 구성 파일을 점진적으로 업데이트 할 수 있습니다. 도와 주셔서 감사합니다!
Joe Casadonte

Mercurial과 Git을 모두 사용하십시오.
Linc

171

이 기사에서는이를 비교적 잘 다룹니다.

https://github.com/rrrene/gitscm-next/blob/master/app/views/blog/progit/2010-04-11-environment.markdown

기본적으로 명령 줄에서 작업하는 경우 예상보다 간단합니다. 2 git repos를 원한다고 가정하십시오.

.gitone
.gittwo

다음과 같이 설정할 수 있습니다.

git init .
mv .git .gitone
git init .
mv .git .gittwo

다음과 같이 파일을 추가하고 하나에 만 커밋 할 수 있습니다.

git --git-dir=.gitone add test.txt
git --git-dir=.gitone commit -m "Test"

따라서 git에 대한 옵션이 먼저 나오고, 그다음에 명령이 나온 다음 git 명령의 옵션이 나옵니다. 다음과 같이 git 명령에 쉽게 별칭을 지정할 수 있습니다.

#!/bin/sh
alias gitone='git --git-dir=.gitone'
alias gittwo='git --git-dir=.gittwo'

그래서 당신은 gitone commit -m "blah".

까다로워 보이는 것은 무시하는 것입니다. .gitignore는 일반적으로 프로젝트 루트에 있기 때문에 전체 루트를 전환하지 않고이를 전환하는 방법도 찾아야합니다. 또는 .git / info / exclude를 사용할 수 있지만 수행 한 모든 무시는 커밋되거나 푸시되지 않아 다른 사용자를 망칠 수 있습니다. 두 저장소 중 하나를 사용하는 다른 사용자는 .gitignore를 푸시하여 충돌을 일으킬 수 있습니다. 이러한 문제를 해결하는 가장 좋은 방법이 명확하지 않습니다.

TortoiseGit과 같은 GUI 도구를 선호하는 경우 몇 가지 문제가 있습니다. 이러한 도구의 가정이 충족되도록 .gitone 또는 .gittwo의 이름을 일시적으로 .git로 바꾸는 작은 스크립트를 작성할 수 있습니다.


1
별칭으로 설정하면 다음 오류가 발생합니다. $ git config --global alias.pub '--git-dir = ~ / Server / www / .gitpublic'$ git pub add. fatal : alias 'pub'는 환경 변수를 변경합니다. 별칭에 '! git'을 사용하여이를 수행 할 수 있습니다. 이 경우 "! git"을 어디에 설정 하시겠습니까?
JaredBroad

1
@JaredBroad 흥미로운-git 별칭이 아닌 Bash 별칭을 사용하도록 제안했습니다. 좋아요alias gitone='git --git-dir=.gitone'
Chris Moschini 2014-07-20

10
자체 제외 파일을 사용하도록 리포지토리를 구성 할 수 있으며이를 추적 할 수 있습니다 (예 : gitone config core.excludesfile gitone.excludegitone add gitone.exclude. 나는 스크립트를 만들어이이 솔루션에 펼쳐지는 github.com/capr/multigit

2
@JaredBroad 나는이처럼 한 git config --global alias.youralias '!git --git-dir="/d/MyProject/_git"'git youralias status:
starikovs

1
.gitignore파일이 일반적으로 설정 후 삭제 된다고 가정 하면 각 저장소에 대해 서로 다른 복사본을 만든 다음 관련 버전을 별칭의 일부로 디렉터리에 복사 할 수 있습니다. 이 같은 루트에 다른 파일이 힘 충돌에 적용 README.md하고 .gitattributes.
thdoan

15

git submodule 살펴보십시오 .

하위 모듈을 사용하면 항상 특정 커밋을 가리키는 소스 트리의 전용 하위 디렉터리에 외부 저장소를 포함 할 수 있습니다.


8
디렉토리의 루트에 있어야하는 파일에는 적합하지 않습니다. 유일한 기회는 이것들에 대한 심볼릭 링크의 루트를 채우는 것입니다.
WhyNotHugo 2010

6

RichiH는 하나 이상의 작업 디렉토리를 $ HOME에 배치하기 위해 git의 가짜 베어 저장소를 사용하여 dotfile 을 관리 하는 도구 인 vcsh 라는 도구를 작성했습니다 . csh AFAIK와 관련이 없습니다.

그러나 여러 디렉토리가있는 경우 git-submodules (최상의 상황에서 고통 스럽고이 예제 사용이 최상의 상황이 아님 )의 대안gitslave 로 슬레이브 리포지토리를 항상 분기하고 보조 저장소를 변경하기 위해 3 단계 프로세스가 필요하지 않습니다 (올바른 분기로 체크 아웃하고 변경 사항을 적용하고 커밋 한 다음 수퍼 프로젝트로 이동하여 새 하위 모듈 커밋을 커밋).


6

변수를 사용하여 가능 GIT_DIR하지만 수행중인 작업을 모르는 경우 많은주의 사항이 있습니다.


4

예, 서브 모듈은 아마도 당신이 원하는 것입니다. 또 다른 옵션은 하위 디렉토리에 작업 복사본을두고 홈 디렉토리에서 관심있는 파일로 심볼릭 링크를 지정하는 것입니다.


3

내가 선호하는 방법은 하위 디렉토리에서 repo를 사용하고 재귀 심볼릭 링크를 사용하는 것입니다.

git clone repo1
cd somerepo
git clone repo2
cd repo2
./build

' repo / build'-파일은 다음과 같습니다.

#!/bin/bash 
SELF_PATH="$(dirname "$(readlink -f "$0")" )"  # get current dir 
cd .. && git stash && git clean -f -d ''       # remove previous symlinks
cp -sR "$SELF_PATH"/* ../.                     # create recursive symlinks in root

주의 : 'git add'를 사용하지 마십시오.


0

다른 옵션은 별도의 폴더에 있고 한 폴더에서 다른 폴더로 심볼릭 하드 링크를 만드는 것입니다.

예를 들어 저장소가있는 경우 :

  1. Repo1 / FolderA
  2. Repo1 / FolderB

과:

  1. Repo2 / FolderC

폴더 FolderAFolderBRepo1에서 Repo2로 심볼릭 링크 할 수 있습니다 . Windows의 경우 Repo1에서 실행할 명령은 다음과 같습니다.

User@Repo1$ mklink /J FullPath/Repo2/FolderA FullPath/Repo1/FolderA
User@Repo1$ mklink /J FullPath/Repo2/FolderB FullPath/Repo1/FolderB
User@Repo1$ printf "/FolderA/*\n/FolderB/*\n" >> .gitignore

주 저장소에있는 파일의 경우 각 파일을 심볼릭 링크 .gitignore하고 원하지 않는 한 노이즈를 피하기 위해 저장소 에 추가해야 합니다.


0

면책 조항 : 이것은 광고가 아닙니다. 저는 제공된 라이브러리의 개발자입니다.

여러 저장소를 하나의 폴더에 혼합하려는 경우를 처리하기 위해 git 확장을 만들었습니다. lib의 장점은 저장소와 파일 충돌을 추적하는 것입니다. github에서 찾을 수 있습니다 . 시도해 볼 수있는 2 개의 예제 저장소도 있습니다.

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