git 저장소에 여러 프로젝트를 배치하는 가장 좋은 방법은 무엇입니까? [닫은]


188

어떤 이유로 든 사용할 저장소하나 뿐입니다 .
그러나 프로젝트 및 앱 프로젝트를 포함한 여러 프로젝트가 있습니다. javaphp scriptsAndroid

이제 내 문제는 다른 IDE를 사용 하는 저장소 내의 다른 하위 폴더에 배치
해야한다는 것입니다. 각 IDE에는 자체 작업 공간이있을 수 있습니다.

누가 문제를 해결하기위한 모범 사례를 말해 줄 수 있습니까?



2
당신은 혼자가 아닙니다. 학습 목적으로 사용하는 저장소 와 비슷한 경우가 있습니다 (예 : github.com/hopbit/java-sandbox ). 나는 내가 읽기 시작하는 모든 새로운 책 / 자습서에 대한 예제를 시도하기 위해 새로운
레포지토리

이를 수행하려는 한 가지 이유는 테스트 또는 프로덕션과 같은 런타임 환경에 배치하는 제품 코드 인 하나의 프로젝트가있는 경우입니다. 두 번째 프로젝트는 시스템이 첫 번째 프로젝트를 테스트하는 응용 프로그램입니다 (예 : BDD). 이 두 프로젝트 사이에는 밀접한 관계가 있으며 이제는 하나의 저장소 URL을 사용하여 전체를 유지 관리 / 참조 할 수 있습니다.
랜스 종류

아래와 같이 요약 "힘내이 동일하거나 서로 다른 프로젝트의 일부인지 아무 생각이 없습니다"
ahmednabil88

답변:


198

대부분의 사람들이 여러 저장소를 사용하도록 지시하지만 다른 솔루션이 있다고 말할 가치가 있다고 생각합니다.

해결책 1

단일 저장소에는 고아 분기 라고 하는 여러 개의 독립적 인 분기 가 포함될 수 있습니다 . 고아 지점은 서로 완전히 분리되어 있습니다. 그들은 역사를 공유하지 않습니다.

git checkout --orphan BRANCHNAME

현재 브랜치와 관련이없는 새 브랜치를 만듭니다. 각 프로젝트는 자체 분리 된 분기에 있어야합니다.

어떤 이유로 든 git은 고아 체크 아웃 후 약간의 정리가 필요합니다.

rm .git/index
rm -r *

삭제하기 전에 모든 것이 커밋되었는지 확인하십시오

고아 지점이 깨끗해지면 정상적으로 사용할 수 있습니다.

해결책 2

번거로운 고아 지점을 피하십시오. 두 개의 독립적 인 리포지토리를 생성하고 동일한 원격으로 푸시하십시오. 각 리포지토리마다 다른 브랜치 이름을 사용하십시오.

# repo 1
git push origin master:master-1

# repo 2
git push origin master:master-2

고마워, 내 문제를 해결할 수 있어야합니다. 실제로 두 솔루션은 지점을 사용하여 다른 프로젝트를 보유합니다.
스토니

6
솔루션 2를 이해하지 못했습니다. 모든 .git 파일을 마스터 git 저장소에 커밋한다고 말하고 있습니까? 여러 고아 브랜치 사용과 여러 가지 브랜치 사용의 차이점은 무엇입니까?
Nate

14
@Nate 그가 말하는 것은 이것입니다. 두 개의 개별 로컬 리포지토리를 만든 다음 GitHub 의 동일한 원격 리포지토리 로 푸시하십시오 .
모자와 사람

1
감사합니다 @TheGuywithTheElfHat. 이제 다시 (9 개월 후) 다시 살펴보면 분명해 보입니다. 솔루션 2는 여전히 고아 분기를 만들고 있지만이 방법을 다루는 것이 더 쉬운 방법을 알 수 있습니다.
Nate

21
솔루션 2에 대한 자세한 설명이 필요합니다
eC Droid

19

해결책 3

여러 프로젝트에 단일 디렉토리를 사용하기위한 것입니다. 필자는이 기법을 밀접하게 관련된 일부 프로젝트에 자주 사용하는데, 프로젝트간에 변경 사항을 자주 가져와야합니다. 고아 브랜치 아이디어와 비슷하지만 브랜치가 고아 일 필요는 없습니다. 동일한 빈 디렉토리 상태에서 모든 프로젝트를 시작하십시오.

하나의 커밋 된 빈 디렉토리에서 모든 프로젝트를 시작하십시오.

이 솔루션에서 놀라운 것을 기대하지 마십시오. 내가 알다시피, 당신은 항상 추적되지 않은 파일로 성 가실 것입니다. Git은 실제로 무엇을 해야할지 알지 못하므로 컴파일러가 생성하고 .gitignore 파일에 의해 무시되는 중간 파일이 있으면 빠르게 스왑하려고하면 시간이 약간 걸릴 수 있습니다 예를 들어 소프트웨어 프로젝트와 PH.D 논문 프로젝트 사이.

그러나 여기에 계획이 있습니다. 빈 저장소를 커밋하여 git 프로젝트를 시작한 다음 시작한 다음 동일한 빈 디렉토리 상태에서 모든 프로젝트를 시작하십시오. 그렇게하면 두 개의 파일이 상당히 독립적임을 확신 할 수 있습니다. 또한, 당신의 지점에 적절한 이름을 지정하고 게으르게 "마스터"를 사용하지 마십시오. 프로젝트를 분리해야하므로 적절한 이름을 지정하십시오.

Git 커밋 (따라서 태그와 브랜치)은 기본적으로 디렉토리와 하위 디렉토리의 상태를 저장하며 Git은 동일한 프로젝트 또는 다른 프로젝트의 일부인지 알지 못 하므로 실제로 동일한 저장소에 다른 프로젝트를 저장하는 git에는 아무런 문제가 없습니다. 문제는 다른 프로젝트를 사용하거나 나중에 프로젝트를 분리 할 때 한 프로젝트에서 추적되지 않은 파일을 지우는 것입니다.

빈 저장소 만들기

cd some_empty_directory
git init
touch .gitignore
git add .gitignore
git commit -m empty
git tag EMPTY

빈 프로젝트부터 시작하십시오.

하나의 프로젝트로 작업하십시오.

git branch software EMPTY
git checkout software
echo "array board[8,8] of piece" > chess.prog

git add chess.prog 
git commit -m "chess program"

다른 프로젝트를 시작하십시오

니가 좋을 때 아무 때 나.

git branch thesis EMPTY
git checkout thesis
echo "the meaning of meaning" > philosophy_doctorate.txt
git add philosophy_doctorate.txt 
git commit -m "Ph.D"

앞뒤로 전환

원할 때마다 프로젝트간에 전환 할 수 있습니다. 이 예제는 체스 소프트웨어 프로젝트로 돌아갑니다.

git checkout software
echo "while not end_of_game do make_move()" >> chess.prog
git add chess.prog 
git commit -m "improved chess program"

추적되지 않은 파일은 성가시다

그러나 프로젝트 / 브랜치간에 스왑 할 때 추적되지 않은 파일에 짜증이 날 것입니다.

touch untracked_software_file.prog
git checkout thesis 
ls
    philosophy_doctorate.txt  untracked_software_file.prog

극복 할 수없는 문제는 아닙니다

정의에 따르면, git은 추적되지 않은 파일로 무엇을해야하는지 잘 모르며 파일을 처리하는 것은 사용자의 책임입니다. 다음과 같이 추적되지 않은 파일이 한 지점에서 다른 지점으로 이동하는 것을 막을 수 있습니다.

git checkout EMPTY 
ls
    untracked_software_file.prog
rm -r *
    (directory is now really empty, apart from the repository stuff!)
git checkout thesis
ls
    philosophy_doctorate.txt

새 프로젝트를 확인하기 전에 디렉토리가 비어 있는지 확인하여 다른 프로젝트에서 추적되지 않은 파일이 걸려 있지 않은지 확인했습니다.

개선

$ GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01T01:01:01' git commit -m empty

빈 저장소를 커밋 할 때마다 동일한 날짜가 지정된 경우 독립적으로 작성된 빈 저장소 커밋은 동일한 SHA1 코드를 가질 수 있습니다. 이를 통해 두 개의 리포지토리를 독립적으로 만든 다음 나중에 하나의 리포지토리에 공통 루트가있는 단일 트리로 병합 할 수 있습니다.

# Create thesis repository. 
# Merge existing chess repository branch into it

mkdir single_repo_for_thesis_and_chess
cd single_repo_for_thesis_and_chess
git init
touch .gitignore
git add .gitignore
GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01:T01:01:01' git commit -m empty
git tag EMPTY
echo "the meaning of meaning" > thesis.txt
git add thesis.txt
git commit -m "Wrote my PH.D"
git branch -m master thesis

# It's as simple as this ...
git remote add chess ../chessrepository/.git
git fetch chess chess:chess

결과

병합 된 저장소의 다이어그램

프로젝트 당 하위 디렉토리를 사용합니까?

예를 들어 파일이 아닌 서브 디렉토리에 프로젝트를 유지하는 경우에도 도움이 될 수 있습니다.

chess.prog
philosophy_doctorate.txt 

있다

chess/chess.prog
thesis/philosophy_doctorate.txt 

이 경우 추적되지 않은 소프트웨어 파일은입니다 chess/untracked_software_file.prog. thesis디렉토리 에서 작업 할 때 추적되지 않은 체스 프로그램 파일이 방해받지 않아야하며 다른 프로젝트에서 추적되지 않은 파일을 삭제하지 않고 행복하게 작업 할 수있는 경우가 있습니다.

또한 다른 프로젝트에서 추적되지 않은 파일을 제거하려면 원치 않는 파일을 각각 선택하여 제거하는 것보다 원치 않는 디렉토리를 덤프하는 것이 더 빠릅니다 (오류가 적은 경향이 있음).

지점 이름에는 '/'문자가 포함될 수 있습니다

따라서 지점 이름을 다음과 같이 지정할 수 있습니다.

project1/master
project1/featureABC
project2/master
project2/featureXYZ

9

사용 git submodules합니다.

여기 모습이 힘내 저장소에 Git 저장소를

2019 년 2 월 기준으로 제안합니다. Monorepos


5
"사용할 저장소가 하나뿐입니다." 동일한 저장소에 여러 서브 모듈을 저장하는 방법을 설명 하시겠습니까?
Ivan

4
git submodule add [url to git repo]- git-scm.com/book/en/v2/Git-Tools-Submodules
prasanthv

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