로컬 저장소에서 원격 Git 저장소를 작성하는 방법은 무엇입니까?


243

로컬 Git 저장소가 있습니다. 원격 ssh 지원 서버에서 사용할 수 있도록하고 싶습니다. 어떻게해야합니까?

답변:


288

원격 위치에 베어 리포지토리를 만들고 git init --bare로컬 리포지토리 ( git remote add origin URL) 의 푸시 / 풀 트래커로 원격 측을 추가 한 다음 로컬이라고 말합니다 git push origin master. 이제 다른 저장소는 pull원격 저장소에서 가능합니다.


@Nips : 예, 그렇습니다. 죄송합니다. 실제로 개별 가지를 밀어 넣습니다!
Kerrek SB

GUI를 사용중인 경우 어떻게합니까? 모든 리포지토리에 대한 서버를 설정하고 동일한 네트워크의 각 PC에 연결하려면 어떻게해야합니까?
SearchForKnowledge

4
경우 git push origin master오류 "을 (를) 찾을 수 없습니다 저장소"와 함께 실패, 시도 git update-server-info당신이 한 경우, 원격 측에git init --bare
HongKilDong

7
@KerrekSB 내가 내 로컬에 자식 밀어 원산지 마스터를 실행으로 가능한 자동하자마자 서버에 베어의 repo를 만드는 것입니다
ANinJa

@ HongKilDong 시도 git update-server-info했지만 오류가 발생합니다 fatal: Unable to look up Volumes (port 9418) (nodename nor servname provided, or not known)
Nayef

81

Git 서버를 처음 설정하려면 기존 리포지토리를 새로운 기본 리포지토리 (작업 디렉토리가없는 리포지토리)로 내 보내야합니다. 이것은 일반적으로 간단합니다. 새 Bare 저장소를 작성하기 위해 저장소를 복제하려면 --bare옵션 과 함께 clone 명령을 실행하십시오 . 기본적으로 Bare 저장소 디렉토리는 다음 .git과 같이 끝납니다 .

$ git clone --bare my_project my_project.git
Initialized empty Git repository in /opt/projects/my_project.git/

이 명령은 작업 디렉토리없이 Git 리포지토리 자체를 가져 와서 단독으로 디렉토리를 만듭니다.

저장소의 사본이 준비되었으므로 서버에 저장하고 프로토콜을 설정하기 만하면됩니다. git.example.comSSH 액세스 권한이 있는 서버를 설정했으며 모든 Git 리포지토리를 /opt/git디렉토리 에 저장하려고 한다고 가정 해 봅시다 . 베어 리포지토리를 복사하여 새 리포지토리를 설정할 수 있습니다.

$ scp -r my_project.git user@git.example.com:/opt/git

이때 /opt/git디렉토리에 대한 읽기 액세스 권한이있는 동일한 서버에 대한 SSH 액세스 권한이있는 다른 사용자는 다음을 실행하여 저장소를 복제 할 수 있습니다.

$ git clone user@git.example.com:/opt/git/my_project.git

사용자가 서버에 SSH로 접속하여 /opt/git/my_project.git디렉토리에 대한 쓰기 액세스 권한이 있으면 자동으로 푸시 액세스 권한도 부여됩니다. --shared옵션으로 git init 명령을 실행하면 Git은 그룹 쓰기 권한을 저장소에 자동으로 추가합니다 .

$ ssh user@git.example.com
$ cd /opt/git/my_project.git
$ git init --bare --shared

Git 리포지토리를 가져 와서 베어 버전을 생성하여 사용자와 공동 작업자가 SSH 액세스 권한이있는 서버에 배치하는 것은 매우 쉽습니다. 이제 동일한 프로젝트에서 공동 작업 할 준비가되었습니다.


6
scp솔루션은 실제보다 IMO가 더 잘 작동합니다 init --bare. 처음에는 로컬로 복제 한 다음 서버에 복사하지만 여전히 git이 한 번에 명령을 수행하기를 원하지만 추악한 해킹을 느낍니다.
leftaroundabout

1
나를 위해 일했기 때문에 +1했습니다 --shared. 나는 당신 git init --shared--bare하나 를 만들지 않고 사용하면 어떻게되는지 궁금합니다 .
icedwater

1
베어 리포지토리를 로컬로 만들고 scp원격이 지원하지 않으면 원격에 대한 저장소 가 더 잘 작동합니다 git init --bare(git 1.5.5, 2008의 경우와 마찬가지로). 리모컨에 자식이 전혀 없어도 작동해야한다고 생각합니다.
Yaroslav Nikitenko


1
사소한 참고 사항 : 솔루션의 단계 scp는 정확하지만 원격 사용자에게 일반 쉘이 있으면 작동합니다. 사용자가 git-shell을 사용하면 작동하지 않습니다.
user1708042

9

Windows에서 로컬 사본을 작성하고 Unix 라인 시스템에서 해당 원격 저장소를 작성하려는 사용자를위한 참고 사항. 텍스트 파일은 Unix 계열 시스템의 개발자가 추가 복제본에서 LF로 끝나지만 Windows에서는 CRLF로 끝납니다.

줄 끝 번역설정하기 전에 Windows 리포지토리를 만든 경우 문제가 있습니다. Git의 기본 설정은 변환되지 않으므로 작업 세트는 CRLF를 사용하지만 리포지토리 (예 : .git에 저장된 데이터)도 파일을 CRLF로 저장했습니다.

원격으로 푸시하면 저장된 파일이 그대로 복사되고 줄 끝 변환이 발생하지 않습니다. (줄 끝 변환은 저장소를 푸시 할 때가 아니라 파일을 저장소에 커밋 할 때 발생합니다). 유닉스 계열 저장소에서 CRLF를 사용하면 원하는 것이 아닙니다.

원격 저장소에서 LF를 가져 오려면 Windows 저장소를 다시 정규화하여 먼저 LF가 로컬 저장소에 있는지 확인해야 합니다 . 여전히 CRLF 엔딩이있는 Windows 작업 세트에는 눈에 띄는 영향을 미치지 않지만 리모컨으로 푸시하면 리모컨에 LF가 올바르게 표시됩니다.

Windows 리포지토리에 어떤 줄 엔딩이 있는지 쉽게 알 수 있는지 확실하지 않습니다. core.autocrlf = false를 설정 한 다음 복제하여 리포지토리를 테스트 할 수 있습니다 (리포지토리에 LF 엔딩이 있으면 클론은 LF도).


5

위의 두 가지 인기있는 솔루션에는 흥미로운 차이점이 있습니다.

  1. 다음과 같이 Bare 저장소를 작성하는 경우 :

    cd / outside_of_any_repo
    mkdir my_remote.git
    cd my_remote.git
    자식 초기화-베어
    

그리고

cd  /your_path/original_repo
git remote add origin /outside_of_any_repo/my_remote.git
git push --set-upstream origin master

그런 다음 git은 다음과 같은 관계로 'original_repo'에서 구성을 설정합니다.

original_repo origin --> /outside_of_any_repo/my_remote.git/

후자는 업스트림 리모컨으로 사용됩니다. 업스트림 리모컨에는 구성에 다른 리모컨이 없습니다.

  1. 그러나 다른 방법으로하면 :

    (original_repo 디렉토리에서)
    cd ..
    git clone --bare original_repo /outside_of_any_repo/my_remote.git
    

'my_remote.git'은 'origin'이 원격으로 'original_repo'를 가리키는 구성으로, 로컬 디렉토리 경로와 같은 remote.origin.url과 함께 구성으로 이동합니다. 이는 이동하려는 경우 적합하지 않을 수 있습니다 서버에.

"원격"참조가 적절하지 않은 경우 나중에 제거하기 쉽지만, 'original_repo'는 여전히 'my_remote.git'를 업스트림 리모컨 (또는 어디를 가든지)으로 가리 키도록 설정해야합니다. 공유 할 수 있습니다). 기술적으로는 접근법 # 2를 사용하여 몇 가지 단계를 더 수행하면 동일한 결과를 얻을 수 있습니다. 그러나 # 1은 더 적은 수의 단계로 서버로 이동하기에 적합한 로컬에서 생성 된 "중앙 베어 공유 리포지토리"를 만드는보다 직접적인 접근 방법으로 보입니다. 나는 그것이 원격 저장소가 원하는 역할에 달려 있다고 생각합니다. (그렇습니다. 이것은 여기 문서와 충돌 합니다 .)

주의 사항 : 실제 저장소로 로컬 시스템에서 테스트를 한 다음 결과를 파일별로 비교하여 위의 내용 (2019 년 8 월 초이 글에서)을 배웠습니다. 그러나! 나는 아직도 배우고 있으므로 더 정확한 방법이있을 수 있습니다. 그러나 내 테스트는 # 1이 현재 선호되는 방법이라는 결론을 내리는 데 도움이되었습니다.


4

원격 저장소는 일반적으로 작업 디렉토리가없는 Git 저장소 인 Bare 저장소입니다. 저장소는 협업 지점으로 만 사용되므로 디스크에서 스냅 샷을 체크 아웃 할 이유가 없습니다. Git 데이터 일뿐입니다. 가장 간단한 용어로, 베어 리포지토리는 프로젝트의 .git 디렉토리의 내용이며 다른 것은 없습니다.

다음 코드를 사용하여 git 저장소를 만들 수 있습니다.

$ git clone --bare /path/to/project project.git

원격 자식 저장소를 가지기위한 한 가지 옵션은 SSH 프로토콜을 사용하는 것입니다.

자체 호스팅이 SSH를 통한 Git의 일반적인 전송 프로토콜입니다. 서버에 대한 SSH 액세스가 이미 대부분의 장소에 설정되어 있기 때문입니다. 그렇지 않은 경우 쉽게 수행 할 수 있습니다. SSH는 또한 인증 된 네트워크 프로토콜이며, 유비쿼터스이므로 일반적으로 설정 및 사용이 쉽습니다.

SSH를 통해 Git 저장소를 복제하려면 ssh://다음과 같이 URL을 지정할 수 있습니다 .

$ git clone ssh://[user@]server/project.git

또는 SSH 프로토콜에 더 짧은 scp 유사 구문을 사용할 수 있습니다.

$ git clone [user@]server:project.git

위의 두 경우 모두 선택적 사용자 이름을 지정하지 않으면 Git은 현재 로그인 한 사용자를 가정합니다.

프로

SSH를 사용하는 장점은 많습니다. 첫째, SSH는 비교적 설정하기 쉽습니다. SSH 데몬은 일반적이며 많은 네트워크 관리자가 경험하고 있으며 많은 OS 배포판이 설치되어 있거나이를 관리 할 도구가 있습니다. 다음으로 SSH를 통한 액세스가 안전합니다. 모든 데이터 전송이 암호화되고 인증됩니다. 마지막으로 HTTPS, Git 및 로컬 프로토콜과 같이 SSH는 효율적이므로 데이터를 전송하기 전에 가능한 한 컴팩트하게 만듭니다.

단점

SSH의 부정적인 측면은 Git 리포지토리에 대한 익명 액세스를 지원하지 않는다는 것입니다. SSH를 사용하는 경우 사람들은 읽기 전용 용량으로도 시스템에 대한 SSH 액세스 권한이 있어야합니다. 따라서 SSH를 통해 저장소를 복제하여 검사하려는 오픈 소스 프로젝트에 SSH가 도움이되지는 않습니다. 회사 네트워크 내에서만 사용하는 경우 SSH가 처리해야하는 유일한 프로토콜 일 수 있습니다. 프로젝트에 대한 익명의 읽기 전용 액세스를 허용하고 SSH를 사용하려면 SSH를 설정해야하지만 다른 사용자가 가져올 수 있도록 SSH를 설정해야합니다.

자세한 내용은 참조를 확인하십시오. 서버에서의 Git-프로토콜


3

원격 서버에서 디렉토리를 작성해야합니다. 그런 다음 "git init"명령을 사용하여이를 저장소로 설정하십시오. 이것은 당신이 가진 각각의 새로운 프로젝트 (각 새로운 폴더)에 대해 수행되어야합니다

ssh 키를 사용하여 git을 이미 설정하고 사용했다고 가정하면 작업 디렉토리에서 실행될 때 원격을 설정하고 디렉토리를 git repo로 초기화하는 작은 Python 스크립트를 작성했습니다. 물론 모든 리포지토리에 대해 서버와 루트 경로를 알려주려면 스크립트를 한 번만 편집해야합니다.

여기를 확인하십시오-https: //github.com/skbobade/ocgi


-3

일반적으로 init명령을 사용하여 git repo를 설정할 수 있습니다

git init

귀하의 경우에는 이미 사용 가능한 리모콘에 대한 저장소가 있습니다. 원격 저장소에 액세스하는 방법에 따라 (url 내부의 사용자 이름 또는 확인을 처리하는 ssh 키 사용) clone명령을 사용하십시오 .

git clone git@[my.url.com]:[git-repo-name].git

repo를 복제하는 다른 방법도 있습니다. 이 방법으로 컴퓨터에 저장소를 가져올 때 확인하는 ssh 키 설정이 있으면 호출합니다. 원격 저장소에 로그인하기 위해 비밀번호와 사용자 이름을 내부에 포함하려는 경우 다른 URL 조합이 있습니다.


1
어떻게 아이러니가 .... 누군가 오늘이 대답을 downvoted, 그리고 지금 내 파일을 밀어 어려움을 겪고 있습니다. 다시 git 운동을해야 할 것 같습니다.
Alex Cio 2012

7
문제는 OP가 ssh 서버에서 원격 저장소를 작성하는 솔루션을 원했지만 원격 ssh 서버에서 로컬 저장소를 작성하는 방법을 설명했다는 것입니다. 당신은 질문에 대답하지 않았습니다.
아니었다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.