programing

일반 Git 저장소를 기본 저장소로 변환하려면 어떻게 해야 합니까?

telecom 2023. 4. 10. 20:57
반응형

일반 Git 저장소를 기본 저장소로 변환하려면 어떻게 해야 합니까?

일반 Git 저장소를 기본 저장소로 변환하려면 어떻게 해야 합니까?

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

  • Git에는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」.git 와 작업 하는 다른 모든 내의

  • GitGit」라고 부릅시다)가.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 /path/to/repo(여기서 설명한 바와 같이) 새로운 장소로 이동합니다.

이 시나리오를 고려하다

  • 당신의 출신지에는 100개의 지점이 있었습니다.
    • 그 중 10개만 로컬에서 체크아웃했습니다.
    • 당신의 맨 레포는 10개밖에 없어요.
  • 맨손으로 어디론가 보내줘
    • 90개의 저장소가 누락됩니다.

그게 당신의 의도라면 괜찮아요.리모트/오리진의 미러링이 필요한 경우는, 이 방법이 아닙니다.

이 방법은 효과가 있을 것 같습니다.빈 저장소의 파일 구조는 .git 디렉토리 안에 있는 파일 구조입니다.하지만 실제로 변경된 파일이 있는지는 알 수 없습니다.그러면 실패하면 다음 작업을 수행할 수 있습니다.

git clone --bare /path/to/repo

이름 충돌을 피하기 위해 다른 디렉토리에서 작업을 수행한 후 원하는 위치로 다시 이동할 수 있습니다.또한 오리진 리포가 있는 곳을 가리키도록 구성 파일을 변경해야 할 수도 있습니다.

다음 링크가 도움이 될 것 같습니다.

GitFaq: 베어 이외의 기존 저장소를 베어 상태로 만들려면 어떻게 해야 합니까?

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

파일 시스템에서 특별히 비트를 회전시키고 싶거나 회전시킬 필요가 없는 한 베어 버전의 비베어 저장소를 만드는 것은 매우 간단합니다(여기 다른 게시물에서 언급).이것은 git의 핵심 기능의 일부입니다.

git clone --bare existing_repo_path bare_repo_path

사용도 검토해 주십시오.

git clone --mirror path_to_source_repository path_to_bare_repository

매뉴얼에서 다음 항목을 참조하십시오.

소스 저장소의 미러를 설정합니다.이것은 --bare를 의미합니다.--bare와 비교하여 --mirror는 소스의 로컬 브랜치를 타겟의 로컬 브랜치에 매핑할 뿐만 아니라 모든 참조(리모트 트래킹 브랜치, 노트 등)를 매핑하고 이러한 모든 참조를 타겟저장소의 git 리모트업데이트에 의해 덮어쓰도록 refspec 구성을 설정합니다.

네트워크 경로상의 저장소로 푸시하고 싶었을 뿐인데, 저장소가 bare로 표시되어 있지 않으면 git에서는 그렇게 할 수 없습니다.필요한 것은 설정을 변경하는 것 뿐이었습니다.

git config --bool core.bare true

파일을 깨끗하게 유지하고 싶지 않으면 파일을 만지작거릴 필요가 없습니다.

답을 읽고 이렇게 했어요

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/.gitrepos.git

여기 가장 안전하고 간단한 것이 있습니다.여기에 위에 명시되지 않은 것은 없다.안전한 단계별 절차를 보여주는 답을 알고 싶을 뿐입니다.베어(bare)로 할 저장소(repo)에서 하나의 폴더를 시작합니다.베어 리포지토리 폴더의 확장자는 .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 on the Server - Git on a Server

결론부터 말하면

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

그런 다음 my_project.git을 서버에 저장합니다.

주로 42번이 지적하려고 했던 것이 바로 그 대답입니다.쉬렐리, 바퀴를 재창조할 수 있다;-)

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라는 이름의 repo에 복제합니다.

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

다음으로 /path/to/normal/repo를 가리키는 원점을 삭제합니다.

cd repo.git
git remote rm origin

마지막으로 원래 repo를 제거할 수 있습니다.그 시점에서 repo.git의 이름을 repo로 변경할 수 있지만 git 저장소를 나타내는 표준 규약은 something.git이기 때문에 개인적으로 그렇게 하겠습니다.

이 작업을 모두 마치면 새로운 베어 레포(실제로 일반 레포 작성 및 베어에서 일반 레포 변환 방법)를 복제할 수 있습니다.

물론, 다른 업스트림도 있으면 메모해 두고, 그것을 포함하도록 베어 레포트를 갱신할 필요가 있습니다.하지만 git 명령어를 사용하면 모든 것을 할 수 있습니다.man page는 당신의 친구라는 걸 기억하세요.

로컬 체크 아웃브런치 /refs/heads/*와 리모트브런치 /origin/*가 거의 없는 저장소가 있으며 이를 /refs/heads/*에 있는 모든 브랜치를 BARE 저장소로 변환하는 경우

다음 작업을 수행하여 기록을 저장할 수 있습니다.

  1. 완전한 저장소를 작성하다
  2. 로컬 체크 아웃브런치 및 리모트브런치가 있는 로컬저장소로 cd를 전송합니다.
  3. git 푸시 /path/to/repo +refs/repo / repo / refs / repo / repo / refs /

gitglossarybare repository 정의는 다음과 같습니다.

보통 베어 저장소는 .git 서픽스가 붙은 적절한 이름의 디렉토리이며, 리비전 제어 하에 있는 파일의 로컬 체크아웃된 복사본이 없습니다.즉, 일반적으로 숨겨진 .git 서브 디렉토리에 존재하는 모든 Git 관리 및 제어 파일은 repository.git 디렉토리에 직접 존재하며 다른 파일은 존재하지 않고 체크아웃됩니다.일반적으로 공용 리포지토리의 게시자는 기본 리포지토리를 사용할 수 있도록 합니다.

"로컬 저장소"를 가지고 놀다가 원격 저장소처럼 원하는 것을 할 수 있기를 원했기 때문에 이곳에 왔습니다.그냥 장난치고 있었어요 git에 대해 배우려고요이 답을 읽고 싶은 사람은 이 상황이라고 생각합니다.

전문가의 의견이나 구체적인 반례를 듣고 싶은데, (찾은 git 소스 코드를 뒤적여 보니) 그냥 파일로 간 것 같습니다..git/config코어 속성 bare를 true로 설정하면 git은 저장소에서 원격으로 원하는 작업을 수행할 수 있습니다.즉, 다음과 같은 행이 존재해야 합니다..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.defined(true 또는 false 모두 정의되지 않거나 false가 아닙니다).
  2. 워크트리가 없습니다(즉, .git 서브 디렉토리가 메인 디렉토리입니다).

나중에 시험해 보겠습니다만, 이것은 core.disc = true 설정이 core.disc를 컨피규레이션파일에서 삭제하고 디렉토리를 올바르게 설정하는 것과 같은 것을 나타내고 있는 것 같습니다.

어쨌든 core.timeout = true를 설정하면 확실히 push 할 수 있지만 프로젝트 파일의 존재로 인해 다른 작업이 잘못될지는 모르겠습니다.저장소에 푸시하여 로컬에서 무슨 일이 발생했는지 확인하는 것은 흥미롭고 유익합니다(실행 등).git status

다음 스크립트를 사용하여 모든 SVN 저장소의 목록이 있는 텍스트 파일을 읽고 GIT로 변환한 다음 나중에 git clone --bare를 사용하여 bare git repo로 변환했습니다.

#!/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

및 사용자.txt의 형식은 다음과 같습니다.

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

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

ㅇㅇㅇㅇㅇ,backup「이것들」은 다음과 같습니다.

(a)  mkdir backup

(b)  cd backup

(c)  git clone non_bare_repo

다음으로 다음을 실행합니다.

git clone --bare -l non_bare_repo new_bare_repo

2 2:2:
을 쓴 후, 에음, 아음음 에에에에에 PC로 이어지면 될 수 을 깨달았습니다.git add *.

..git왼쪽)은 다음과 같이 컴팩트하고 멋집니다.

git switch --orphan some_new_branch_name 

그런 다음 다음 원하는 경우 베어(bare)로 변환합니다.

git config --bool core.bare true

리모트 링크를 포함한 설정은 다음과 같이 유지됩니다.

$ git config --list
core.repositoryformatversion=0
core.filemode=true
core.bare=true
remote.origin.url=https://github.com/vmatare/thinkfan.git
remote.origin.fetch=+refs/*:refs/*
remote.origin.mirror=true

★★★★
에는, 「 파일하지 않는 추가 ( 「」, 「git」, 「git」의 ).이 경우, 수동으로 추가 삭제(또는 저장소 그 자체)할 필요가 있습니다..git을 이용하다

★★★★★★★
★★의 앞core.bare true일부 작업으로 인해 오류가 발생했습니다.

$ git fetch --all
Fetching origin
fatal: Refusing to fetch into current branch refs/heads/devel of non-bare repository
error: Could not fetch origin

some_new_branch_name에 되어 있지 않다git branch 제가 해봤습니다.git checkout master을 , 다시 못했다.some_new_branch_name의 출력으로git branch★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」orphan분기는 일부 작업이 저장소에서 수행되지 않는 한 저장소에 추가되지 않습니다(및/또는 커밋 수행).

위의 모든 작업을 수행하기 위한 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)

와, 얼마나 많은 사람들이 이 일에 끼어들었는지 정말 놀랍다. 특히 이 사람이 왜 이런 일을 하고 있는지 묻기 위해 단 한 명도 멈추지 않은 것 같다.

베어 GIT 저장소와 비 베어 GIT 저장소의 유일한 차이점은 비 베어 버전에 작업 복사본이 있다는 것입니다.베어 리포(bare repo)를 필요로 하는 주된 이유는 서드파티에 제공하려는 경우 실제로 직접 작업할 수 없기 때문에 어느 시점에서는 일반 작업 복사본 버전으로 바로 되돌릴 필요가 있기 때문입니다.

즉, 베어 리포로 변환하려면 보류 중인 커밋이 없는지 확인한 후 다음 작업을 수행합니다.

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

그렇지, 맨주먹으로.

언급URL : https://stackoverflow.com/questions/2199897/how-to-convert-a-normal-git-repository-to-a-bare-one

반응형