'일반적인'Git 저장소를 베어 저장소로 어떻게 변환 할 수 있습니까?
주요 차이점은 다음과 같습니다.
일반 Git 리포지토리
.git
에는 리포지토리 내에 모든 관련 데이터와 작업 복사본을 구성하는 다른 모든 파일이 들어 있는 폴더가 있습니다.베어 Git 리포지토리에는 작업 복사본이 없으며 폴더 (
repo.git
실제로 호출 )에는 실제 리포지토리 데이터가 포함됩니다
'일반적인'Git 저장소를 베어 저장소로 어떻게 변환 할 수 있습니까?
주요 차이점은 다음과 같습니다.
일반 Git 리포지토리 .git
에는 리포지토리 내에 모든 관련 데이터와 작업 복사본을 구성하는 다른 모든 파일이 들어 있는 폴더가 있습니다.
베어 Git 리포지토리에는 작업 복사본이 없으며 폴더 ( repo.git
실제로 호출 )에는 실제 리포지토리 데이터가 포함됩니다
답변:
한마디로 :의 내용 대체 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
새로운 위치 를 수행하는 것과 다릅니다 (아래 참조).
core.bare
. 이제이 옵션을 인터넷 검색 한 후 확인할 수 있습니다. kernel.org/pub/software/scm/git-core/docs/git-config.html
git clone --bare /path/to/repo
) 보다 훨씬 복잡하고 취약합니다 .
rm
명령이 필요할 수 있습니다 . * \.[!.]*
*
귀하의 방법은 효과가있는 것처럼 보입니다. 베어 리포지토리의 파일 구조는 .git 디렉토리 안에 있습니다. 그러나 파일이 실제로 변경되었는지 여부를 알 수 없으므로 실패하면 할 수 있습니다.
git clone --bare /path/to/repo
이름 충돌을 피하기 위해 다른 디렉토리에서 수행해야 할 수도 있으며 원하는 위치로 다시 이동할 수 있습니다. 그리고 오리진 저장소가있는 곳을 가리 키도록 구성 파일을 변경해야 할 수도 있습니다.
git clone --bare /path/to/repo.git /path/to/newbarerepo.git
git update-server-info
생성 후 Bare Repo 를 실행 하는 한 작동합니다 .
다음 링크가 도움이 될 것이라고 생각합니다.
GitFaq : 기존의 비베 어리 저장소를 맨손으로 만들려면 어떻게합니까?
$ mv repo/.git repo.git
$ git --git-dir=repo.git config core.bare true
$ rm -rf repo
git clone
)에는 위에서 언급 한 nosatalian의 단점이 있습니다.
파일 시스템에서 비트를 특별히 비틀거나 원치 않는 한 비 베어 리포지토리의 베어 버전을 만드는 것은 실제로 간단합니다 (여기의 다른 게시물에 언급되어 있음). 그것은 git의 핵심 기능의 일부입니다.
git clone --bare existing_repo_path bare_repo_path
또한 사용을 고려하십시오
git clone --mirror path_to_source_repository
로부터 문서 :
소스 저장소의 미러를 설정하십시오. 이것은 --bare를 의미합니다. --bare와 비교하여 --mirror는 소스의 로컬 브랜치를 대상의 로컬 브랜치에 매핑 할뿐만 아니라 모든 참조 (원격 추적 브랜치, 노트 등 포함)를 매핑하고 이러한 모든 참조가되도록 참조 사양 구성을 설정합니다. 대상 리포지토리의 git 원격 업데이트로 덮어 씁니다.
clone
). 뭔가 빠졌습니까? 이 되었습니까 --mirror
비교적 최근에 추가는?
--mirror
버전 1.7부터 사용할 수 있습니다. 당신은 체크 아웃 할 수있다 여기에
방금 네트워크 경로의 리포지토리로 푸시하고 싶었지만 git은 해당 리포지토리가 베어로 표시되지 않으면 그렇게 할 수 없습니다. 필요한 것은 구성을 변경하는 것입니다.
git config --bool core.bare true
파일을 깨끗하게 유지하지 않는 한 파일을 조작 할 필요가 없습니다.
가장 안전하고 간단한 생각은 다음과 같습니다. 위에 언급되지 않은 것은 없습니다. 안전한 단계별 절차를 보여주는 답변을보고 싶습니다. 베어하려는 리포지토리 (레포)에서 하나의 폴더를 시작합니다. 베어 리포지토리 폴더의 확장명이 .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
간단히 읽으십시오
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 하나는 바퀴를 재발견 할 수 있었다 ;-)
다음은 UNIX 기반 시스템에서 .bashrc 또는 .profile에 추가 할 수있는 작은 BASH 기능입니다. 추가 쉘이 중 하나를 다시 시작하거나 파일이에 대한 호출을 통해 다시로드되면 source ~/.profile
나 source ~/.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 메시지가 나타나고 파일 시스템 변경이 발생하지 않습니다.
파일을 제거하고 .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 명령을 사용하여 모든 작업을 수행 할 수 있습니다. 매뉴얼 페이지가 당신의 친구임을 기억하십시오.
.git
폴더 의 내부 조사를 시작해야 합니다. 부품을 어떻게 결합시키는 지 배우는 것이 매우 교육적입니다.
다음 스크립트를 사용하여 모든 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를 통해 변경 사항을 푸시하려면 권한이 필요합니다
여기의 정의는 베어 저장소 에서 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
. 나머지 기능은 아마도 다음 상황을위한 것입니다.
나중에 할 수있을 때 실험 해 볼 것입니다.하지만 core.bare = true 설정 은 구성 파일에서 core.bare를 제거하고 디렉토리를 올바르게 설정하는 것과 같습니다 .
어쨌든 core.bare = true로 설정 하면 확실히 밀어 넣을 수 있지만 프로젝트 파일이 있으면 다른 작업이 잘못 될지 확실하지 않습니다. 흥미롭고 저장소에 푸시하고 로컬에서 일어난 일을 보는 것이 유익하다고 생각합니다 (즉 git status
, 결과를 실행 하고 이해합니다).
와우, 얼마나 많은 사람들이이 일에 참여했는지 놀랍습니다. 특히이 사람이 왜 자신이하는 일을하는지 물어 보는 사람이 단 한 명도 아닌 것 같습니다.
베어 및 비 베어 git 저장소의 유일한 차이점은 베어 버전이 아닌 버전에 작업 사본이 있다는 것입니다. 베어 리포지토리가 필요한 주된 이유는 타사에서 사용할 수 있도록하려면 실제로 직접 작업 할 수 없으므로 어느 시점에서 복제해야하는 시점입니다. 일반 작업 카피 버전으로 돌아갑니다.
즉, 맨손으로 리포 어로 변환하려면 보류중인 커밋이 없는지 확인하십시오.
rm -R * && mv .git/* . && rm -R .git
저기 가자, 레포.
git config core.bare true
.
git config core.bare true
과 마찬가지로 설정해야합니다 .
mv repo/.git repo.git; rm -rf repo