일반 Git 저장소를 베어 저장소로 변환하는 방법은 무엇입니까?


602

'일반적인'Git 저장소를 베어 저장소로 어떻게 변환 할 수 있습니까?

주요 차이점은 다음과 같습니다.

  • 일반 Git 리포지토리 .git에는 리포지토리 내에 모든 관련 데이터와 작업 복사본을 구성하는 다른 모든 파일이 들어 있는 폴더가 있습니다.

  • 베어 Git 리포지토리에는 작업 복사본이 없으며 폴더 ( repo.git실제로 호출 )에는 실제 리포지토리 데이터가 포함됩니다


16
아마도 이것은 더 짧은 방법이다 :mv repo/.git repo.git; rm -rf repo
jameshfisher

예, 맞습니다 내가 그 질문을 썼을 때, 이것은 내 역사의 발췌문이었고, 나는 다른 순간을 처형했다.
Boldewyn

54
@eegg 실패 하는 경우 &&대신에 사용하십시오 ! ;mv

답변:


609

한마디로 :의 내용 대체 repo의 내용을 repo/.git한 후, 지금 베어 저장소라는 저장소를 말한다.

이렇게하려면 다음 명령을 실행하십시오.

cd repo
mv .git ../repo.git # renaming just for clarity
cd ..
rm -fr repo
cd repo.git
git config --bool core.bare true

이것은 git clone --bare새로운 위치 를 수행하는 것과 다릅니다 (아래 참조).


9
의 힌트에 감사드립니다 core.bare. 이제이 옵션을 인터넷 검색 한 후 확인할 수 있습니다. kernel.org/pub/software/scm/git-core/docs/git-config.html
Boldewyn

14
감사합니다! mv repo / .git repo.git && rm -rf repo && cd repo.git && git config --bool core.bare true
JasonWoof

56
이것은 아래의 답변 ( git clone --bare /path/to/repo) 보다 훨씬 복잡하고 취약합니다 .
djd

7
도트 파일과 도트 디렉토리를 제거하기 보다는 해당 rm명령이 필요할 수 있습니다 . * \.[!.]**
minopret

6
@Ciantic : 위의 의견에서 이미 설명했듯이 3 년 전 답변이 주어졌지만 5 개월 전에 누군가가 질문을 완전히 다른 것으로 편집했습니다 . 없음 이 페이지의 답변은하지 않습니다 것입니다 어떤 더 이상 의미. 해당 명령 시퀀스는 질문에서 직접 복사되었으며 마지막 두 줄을 추가했습니다.
Jörg W Mittag

244

귀하의 방법은 효과가있는 것처럼 보입니다. 베어 리포지토리의 파일 구조는 .git 디렉토리 안에 있습니다. 그러나 파일이 실제로 변경되었는지 여부를 알 수 없으므로 실패하면 할 수 있습니다.

git clone --bare /path/to/repo

이름 충돌을 피하기 위해 다른 디렉토리에서 수행해야 할 수도 있으며 원하는 위치로 다시 이동할 수 있습니다. 그리고 오리진 저장소가있는 곳을 가리 키도록 구성 파일을 변경해야 할 수도 있습니다.


50
이 방법은 동일하지 않습니다. 복제를 수행해도 구성 옵션이 유지되지 않으므로 git-p4를 사용하는 경우와 같은 올바른 작동에 중요 할 수 있습니다. 또한 클론은 원격을 파괴합니다 .git-p4와 같은 방법으로 복제 할 때 p4 / 마스터 분기가 손실되므로 위의 방법이 바람직합니다.
nosatalian

26
그러나 구성 파일의 각 부분을 복사하여 구성 옵션을 쉽게 전송할 수 있습니다. 파일을 수동으로 복사하고 이름을 바꾸는 것보다이 방법이 더 깨끗하다고 ​​생각합니다.
Philipp

6
git-svn에 --bare에 대한 지원이 없기 때문에 Subversion 마이그레이션 후 완벽합니다.
Keyo

11
이름 충돌을 피하기 위해 ---git clone --bare /path/to/repo.git /path/to/newbarerepo.git
raksja

이것은 git update-server-info생성 후 Bare Repo 를 실행 하는 한 작동합니다 .
ACK_stoverflow

116

다음 링크가 도움이 될 것이라고 생각합니다.

GitFaq : 기존의 비베 어리 저장소를 맨손으로 만들려면 어떻게합니까?

$ mv repo/.git repo.git
$ git --git-dir=repo.git config core.bare true
$ rm -rf repo

2
네, 제가 검색 한 내용입니다. 감사합니다! 그러나 두 번째 제안 ( git clone)에는 위에서 언급 한 nosatalian의 단점이 있습니다.
Boldewyn

1
당신이 제안한 문서는 "안전한 방법은 Git이 이런 식으로 당신을 위해 모든 내부 설정을 처리하게하는 것입니다 ... git clone --bare -l <path_to_repos> <new_dir>"
dafunker

74

파일 시스템에서 비트를 특별히 비틀거나 원치 않는 한 비 베어 리포지토리의 베어 버전을 만드는 것은 실제로 간단합니다 (여기의 다른 게시물에 언급되어 있음). 그것은 git의 핵심 기능의 일부입니다.

git clone --bare existing_repo_path bare_repo_path


6
멀리 있고 가장 좋은 답변이 4 개월 이상 경과 한 후 0 표를 받았다는 것이 놀랍습니다. 매우 좋지는 않지만 위험한 '허용 된 답변'은 200 개입니다!
Stabledog

36
전혀 놀랍지 않습니다-이 답변은 원래 질문에 대한 답변을하지 않습니다. 리포지토리를 변환하지 않고 복제하여 프로세스에서 정보를 잃게됩니다 (예 : 원격 지사).
GreenAsJade

15

또한 사용을 고려하십시오

git clone --mirror path_to_source_repository

로부터 문서 :

소스 저장소의 미러를 설정하십시오. 이것은 --bare를 의미합니다. --bare와 비교하여 --mirror는 소스의 로컬 브랜치를 대상의 로컬 브랜치에 매핑 할뿐만 아니라 모든 참조 (원격 추적 브랜치, 노트 등 포함)를 매핑하고 이러한 모든 참조가되도록 참조 사양 구성을 설정합니다. 대상 리포지토리의 git 원격 업데이트로 덮어 씁니다.


OP가 원하는 것을 수행하는 가장 간결하고 완전하며 안전한 방법 인 것 같습니다 (vs. just clone). 뭔가 빠졌습니까? 이 되었습니까 --mirror비교적 최근에 추가는?
Craig Silver

@CraigSilver : 아니요. 문서 기록에서 볼 수 있듯이 --mirror버전 1.7부터 사용할 수 있습니다. 당신은 체크 아웃 할 수있다 여기에
제이 섹 크라우 지크에게

7

방금 네트워크 경로의 리포지토리로 푸시하고 싶었지만 git은 해당 리포지토리가 베어로 표시되지 않으면 그렇게 할 수 없습니다. 필요한 것은 구성을 변경하는 것입니다.

git config --bool core.bare true

파일을 깨끗하게 유지하지 않는 한 파일을 조작 할 필요가 없습니다.


3
원격 저장소의 작업 트리에서 작업하려는 경우에도 위험합니다. 원격 작업 트리와 색인이 저장소와 동기화되지 않았기 때문에 조만간 변경 사항을 되돌릴 수 있습니다. 수행 중인 작업을 정확히 모르는 경우이 솔루션을 권장하지 않습니다 .
Boldewyn

사실, 원격 베어 저장소의 트리에서 작업해서는 안됩니다.
Slion

6

나는 답변을 읽었으며 이것을 수행했습니다.

cd repos
mv .git repos.git
cd repos.git
git config --bool core.bare true # from another answer
cd ../
mv repos.git ../
cd ../
rm -rf repos/ # or delete using a file manager if you like

이것은 repos/.git맨손으로 내용을 남길 것입니다repos.git


4

가장 안전하고 간단한 생각은 다음과 같습니다. 위에 언급되지 않은 것은 없습니다. 안전한 단계별 절차를 보여주는 답변을보고 싶습니다. 베어하려는 리포지토리 (레포)에서 하나의 폴더를 시작합니다. 베어 리포지토리 폴더의 확장명이 .git이라는 위에서 암시 된 규칙을 채택했습니다.

(1) Backup, just in case.
    (a) > mkdir backup
    (b) > cd backup
    (c) > git clone ../repo
(2) Make it bare, then move it
    (a) > cd ../repo
    (b) > git config --bool core.bare true
    (c) > mv .git ../repo.git
(3) Confirm the bare repository works (optional, since we have a backup)
    (a) > cd ..
    (b) > mkdir test
    (c) > cd test
    (d) > git clone ../repo.git
(4) Clean up
    (a) > rm -Rf repo
    (b) (optional) > rm -Rf backup/repo
    (c) (optional) > rm -Rf test/repo

1
git clone을 사용하여 백업을했기 때문에 이것은 훨씬 안전하지 않습니다. 복제를 통한 백업으로 인해 일부 구성이 손실 될 수 있으며,이 경우 저장소에 중요 할 수 있습니다.
Lie Ryan

유명한. 내가 염려 한 유일한 구성은 모든 로컬 리포지토리에 전역 적입니다.
sdesciencelover

4

간단히 읽으십시오

Pro Git Book : 4.2 서버에서의 Git-서버에서의 Git 얻기

어느쪽으로 끓어

$ git clone --bare my_project my_project.git
Cloning into bare repository 'my_project.git'...
done.

그런 다음 my_project.git 을 서버에 넣으십시오.

주로 42 번 답변 이 지적하려고했던 것입니다. Shurely 하나는 바퀴를 재발견 할 수 있었다 ;-)


나는 어떤이 답변이 추가, 즉에 임의의 길이에서 논의되지 않은보고 실패 어떤 주위의 다른 답변의 것은 ((가)을 downvoted 포함). 명확하게 설명해 주시겠습니까? (그런데 : Pro Git Book은 “이것은 대략 ...와 같은 것입니다.” 라고 말하고 , 정확한 대략의 동등성에 대해서도 이미 여기서 논의하고 있습니다.)
Boldewyn

3

다음은 UNIX 기반 시스템에서 .bashrc 또는 .profile에 추가 할 수있는 작은 BASH 기능입니다. 추가 쉘이 중 하나를 다시 시작하거나 파일이에 대한 호출을 통해 다시로드되면 source ~/.profilesource ~/.bashrc.

function gitToBare() {
  if [ -d ".git" ]; then
    DIR="`pwd`"
    mv .git ..
    rm -fr *
    mv ../.git .
    mv .git/* .
    rmdir .git

    git config --bool core.bare true
    cd ..
    mv "${DIR}" "${DIR}.git"

    printf "[\x1b[32mSUCCESS\x1b[0m] Git repository converted to "
    printf "bare and renamed to\n  ${DIR}.git\n"
    cd "${DIR}.git"
  else
    printf "[\x1b[31mFAILURE\x1b[0m] Cannot find a .git directory\n"
  fi
}

.git 디렉토리를 포함하는 디렉토리 내에서 호출되면 저장소를 변환하기 위해 적절하게 변경됩니다. 호출 할 때 .git 디렉토리가 없으면 FAILURE 메시지가 나타나고 파일 시스템 변경이 발생하지 않습니다.


1

파일을 제거하고 .git 디렉토리를 이동하면서 문제를 일으키는 방법은 깨끗하지 않으며 간단한 작업을 수행하는 "git"방법을 사용하지 않습니다. 이것은 정상적인 저장소를 베어 저장소로 변환하는 가장 깨끗한 방법입니다.

먼저 / path / to / normal / repo를 repo.git이라는 Bare Repo로 복제하십시오.

git clone --bare /path/to/normal/repo

그런 다음 / path / to / normal / repo를 가리키는 원점을 제거하십시오.

cd repo.git
git remote rm origin

마지막으로 원래 저장소를 제거 할 수 있습니다. 그 시점에서 repo.git의 이름을 repo로 바꿀 수 있지만 git 저장소를 나타내는 표준 규칙은 something.git이므로 개인적으로 그렇게 남겨 두겠습니다.

이 모든 작업을 완료하면 새 베어 리포지토리를 복제 할 수 있습니다 (실제로 리포지토리를 생성하고이를 베어에서 노멀로 변환하는 방법 임)

물론 다른 업스트림이있는 경우이를 기록하고 베어 리포지토리를 업데이트하여 포함 시키십시오. 그러나 git 명령을 사용하여 모든 작업을 수행 할 수 있습니다. 매뉴얼 페이지가 당신의 친구임을 기억하십시오.


1
다른 답변을 읽기 위해 귀찮게 했습니까? 특히 @jonescb와 @nosatalian의 의견은 무엇입니까? "git"방법은 "일반 텍스트 파일을 최대한 많이 사용하십시오"입니다. .git폴더 의 내부 조사를 시작해야 합니다. 부품을 어떻게 결합시키는 지 배우는 것이 매우 교육적입니다.
Boldewyn

1

로컬 체크 아웃 브랜치 / refs / heads / * 및 원격 브랜치 브랜치 remotes / origin / *이 적은 리포지토리가 있고 / refs / heads / *에 모든 브랜치가있는 BARE 리포지토리로 변환하려는 경우

기록을 저장하기 위해 다음을 수행 할 수 있습니다.

  1. 베어 리포지토리 생성
  2. 로컬 체크 아웃 브랜치 및 원격 브랜치가있는 로컬 저장소로 cd
  3. git push / path / to / bare / repo + refs / remotes / origin / : refs / heads /

0

다음 스크립트를 사용하여 모든 SVN 저장소의 목록이있는 텍스트 파일을 읽고 GIT로 변환 한 다음 git clone --bare를 사용하여 베어 git 저장소로 변환하십시오.

#!/bin/bash
file="list.txt"
while IFS= read -r repo_name
do
 printf '%s\n' "$repo_name"
 sudo git svn clone --shared --preserve-empty-dirs --authors-file=users.txt file:///programs/svn/$repo_name 
 sudo git clone --bare /programs/git/$repo_name $repo_name.git
 sudo chown -R www-data:www-data $repo_name.git
 sudo rm -rf $repo_name
done <"$file"

list.txt의 형식은

repo1_name
repo2_name

users.txt 형식은

(no author) = Prince Rogers <prince.rogers.nelson@payesley.park.org>

www-data는 Apache 웹 서버 사용자이며 HTTP를 통해 변경 사항을 푸시하려면 권한이 필요합니다


0

여기의 정의는 베어 저장소 에서 gitglossary는 :

베어 리포지토리는 일반적으로 .git 접미사가있는 적절한 이름을 가진 디렉토리로, 버전 관리 대상 파일의 로컬에서 체크 아웃 된 복사본이 없습니다. 즉, 일반적으로 숨겨진 .git 하위 디렉토리에 존재하는 모든 Git 관리 및 제어 파일은 대신 repository.git 디렉토리에 직접 존재하며 다른 파일은 존재하지 않으며 체크 아웃되지 않습니다. 일반적으로 공용 리포지토리 게시자는 베어 리포지토리를 사용할 수 있습니다.

나는 "로컬 리포지토리"를 가지고 놀았 기 때문에 여기에 도착했고 마치 마치 원격 리포지토리처럼 원하는 것을 할 수 있기를 원했습니다. 나는 그냥 놀면서 git에 대해 배우려고 노력했다. 이 답변을 읽고 싶은 사람은 이것이 상황이라고 가정하겠습니다.

나는 그러나 단순히 파일에 가고 (내가 발견 한 몇 가지 자식 소스 코드를 뒤지고 후)이 보인다, 전문가의 의견이나 일부 특정 카운터 - 예제를 사랑 .git/config하고, 설정 의 핵심 속성이 맨발사실 , 자식은 당신이 할 수있게된다 어떤 저장소에 원격으로 수행하려고합니다. 즉, 다음 줄이 있어야합니다 .git/config.

[core]
    ...
    bare = true
...

(이것은 대략 명령 git config --bool core.bare true이 수행하는 작업이므로 더 복잡한 상황을 처리하는 것이 좋습니다.)

이 주장에 대한 나의 정당성은 git 소스 코드에서 repo가 ​​노출되지 않은 경우 두 가지 다른 테스트 방법이있는 것 같습니다. 하나는 전역 변수를 확인하는 것 is_bare_repository_cfg입니다. 이것은 실행의 일부 설정 단계에서 설정되며 .git/config파일 에서 찾은 값을 반영 합니다. 다른 하나는 함수 is_bare_repository()입니다. 이 함수의 정의는 다음과 같습니다.

int is_bare_repository(void)
{
    /* if core.bare is not 'false', let's see if there is a work tree */
    return is_bare_repository_cfg && !get_git_work_tree();
} 

나는 절대 확신을 가지고이 말을하는 시간도 전문 지식되지했습니다,하지만 당신이있는 경우까지로 내가 말할 수 있기 bare를 속성 세트 true의를 .git/config이 항상 반환해야합니다 1. 나머지 기능은 아마도 다음 상황을위한 것입니다.

  1. core.bare는 정의되어 있지 않습니다 (즉, true도 false도 아닙니다)
  2. 작업 트리가 없습니다 (예 : .git 서브 디렉토리가 기본 디렉토리 임)

나중에 할 수있을 때 실험 해 볼 것입니다.하지만 core.bare = true 설정 은 구성 파일에서 core.bare를 제거하고 디렉토리를 올바르게 설정하는 것과 같습니다 .

어쨌든 core.bare = true로 설정 하면 확실히 밀어 넣을 수 있지만 프로젝트 파일이 있으면 다른 작업이 잘못 될지 확실하지 않습니다. 흥미롭고 저장소에 푸시하고 로컬에서 일어난 일을 보는 것이 유익하다고 생각합니다 (즉 git status, 결과를 실행 하고 이해합니다).


-1

먼저 backup기존 리포지토리 :

(a)  mkdir backup

(b)  cd backup

(c)  git clone non_bare_repo

둘째, 다음을 실행하십시오.

git clone --bare -l non_bare_repo new_bare_repo

중간 클론은 무엇입니까?
Stabledog

-4

위의 모든 작업을 수행하는 Oneliner :

for i in `ls -A .`; do if [ $i != ".git" ]; then rm -rf $i; fi; done; mv .git/* .; rm -rf .git; git config --bool core.bare true

(뭔가가 터지고 백업이없는 경우 나를 비난하지 마십시오 : P)


-9

와우, 얼마나 많은 사람들이이 일에 참여했는지 놀랍습니다. 특히이 사람이 왜 자신이하는 일을하는지 물어 보는 사람이 단 한 명도 아닌 것 같습니다.

베어 및 비 베어 git 저장소의 유일한 차이점은 베어 버전이 아닌 버전에 작업 사본이 있다는 것입니다. 베어 리포지토리가 필요한 주된 이유는 타사에서 사용할 수 있도록하려면 실제로 직접 작업 할 수 없으므로 어느 시점에서 복제해야하는 시점입니다. 일반 작업 카피 버전으로 돌아갑니다.

즉, 맨손으로 리포 어로 변환하려면 보류중인 커밋이 없는지 확인하십시오.

rm -R * && mv .git/* . && rm -R .git

저기 가자, 레포.


11
이것은 충분히 드러나지 않을 것입니다. 그것을 밀어보십시오. 당신도해야합니다 git config core.bare true.
Antony Hatchkins

나는 downvote하지 않았다,하지만 난 그냥 지적하고 싶었 설명이 답변의 첫 번째 부분 이유 비 베어 하나는 대 베어 REPO를 원하는 것이 확인 이 충분한 기술적 인 세부 사항을 포함하지 않는 불구하고, 수도 약간 부정확하다. 그러나 대답의 두 번째 부분에서는 해당 명령으로 레포가 베어 지도록 설정하지만 Anthony는 옳습니다 . 이 답변git config core.bare true 과 마찬가지로 설정해야합니다 .
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.