네트워크 액세스없이 여러 시스템에서 Git 사용


84

버전 제어를 사용하고 싶지만 보안상의 이유로 작업중인 서버에 인터넷이 연결되어 있지 않습니다. USB 플래시 드라이브의 파일 만 이동할 수 있습니다. 이 설정으로 여전히 Git을 사용할 수 있습니까? Git 리포지토리에 적용 할 수있는 작은 패치를 만들 수 있습니까?


65
제목에 네트워크 액세스가 없음, 질문에 인터넷 액세스가 없음, 큰 차이.
tkausl

7
@TutuKaeen 인터넷에 연결되지 않은 로컬 네트워크를 가질 수 있습니다. 따라서 github.com 대신 git server를 설정하십시오. 192.168.1.100 및 기타 모든 기능이 동일하게 작동합니다.
Agent_L

12
@TutuKaeen : 중요한 문제는 두 머신간에 직접 (또는 간접) 네트워크 통신이 가능한지 여부입니다. 따라서 귀하의 경우 두 컴퓨터가 네트워크에 연결되어 있지만 네트워크가 분리되어 있습니까? 이 경우 해당 정보를 질문에 편집하십시오.
sleske

15
@TutuKaeen 귀하의 질문은 불분명합니다. 버전 관리를 사용하고 싶다고 말하지만 의견에 따르면 프로덕션 환경에 배포하는 데 도움이 필요합니다. 이러한 문제가 항상 겹치는 것은 아닙니다. 지금 아래에 좋은 답변이 있다고 생각하지만 앞으로 귀하의 질문이 귀하의 요구 사항에 대해보다 포괄적 인 경우 도움이 될 것입니다. "버전 관리를 사용하고 싶습니다. 네트워크에 액세스 할 수 있지만 프로덕션 시스템에는 액세스 할 수 없으며, 버전 제어에서 코드를 프로덕션 시스템으로 가져 오는 방법을 알고 싶습니다. "
DavidS

4
server네트워크에 연결되지 않은 머신에 대해서는 이 용어를 사용하는 것이 이상하게 보입니다 . 인터넷에 연결되지 않아도 로컬 네트워크 일 수 있지만 그럼에도 여전히 네트워크입니다.
Patrick Gregorio

답변:


157

물론 특정 프로토콜이 필요한 Git에 대해서는 아무것도 없습니다. 그냥 밖으로 상자의 표준 클라이언트를 지원 , 중요한 것은, HTTP (S), SSH, 사용자 정의 망할 놈의 프로토콜 및 지역 프로토콜을. 이름 지정은 단지 규칙이지만 로컬 .git디렉토리 의 경로를 사용합니다.이 디렉토리는 작업 디렉토리 ( /path/to/project/.git) 또는 베어 디렉토리 ( /path/to/project.git) 내에있을 수 있습니다 .

이것은 물론 플래시 드라이브를 리모컨으로 추가 할 수 있음을 의미합니다.

git remote add origin /mnt/flashdrive/foo.git

또는 Windows의 경우 :

git remote add origin F:\foo.git

또는 다른 이름을 가진 추가 리모컨으로 추가 할 수도 있습니다 ( origin어딘가에 인터넷 서버를 가리키고 싶은 경우 ).

git remote add flashdrive /mnt/flashdrive/foo.git

그런 다음 다른 리모컨과 마찬가지로이 리모컨으로 밀거나 당기거나 뺄 수 있습니다.

documentation 을 읽으면 file://약간 다르게 작동 하는 프로토콜 도 있음을 알 수 있습니다 . 로컬 경로를 사용하여 추가 최적화를 사용하는 것이 좋습니다. file://프로토콜을 사용하는 경우 git은 일부 표준 네트워크 구성 요소 (로컬 디스크와 통신하기 위해)를 사용하므로 속도가 느려집니다.


50
이 예외적 인 답변을 추가하려면-플래시 드라이브에서 '맨손'저장소를 사용하여 조사하는 것이 좋습니다. '베어'리포지토리에는 작업 트리가 없으므로 OP의 사용 사례처럼 들리는 공유 된 '권한 지점'으로 사용될 때 잠재적 인 문제 범주를 잘라냅니다.
Iron Gremlin

5
file://또한 좀 더 유연하다. 로컬 경로로는 할 수없는 일부 기능 (얕은 복제본 등)을 사용할 수 있습니다.
Austin Hemmelgarn

1
@IronGremlin이 "공유 권한 지점"개념을 확장 할 수 있습니까? 나는 Git 전문가가 아니며 그 의미가 무엇인지 궁금합니다.
궤도에서 가벼움 경주

2
@LightnessRacesinOrbit-이것은 매우 조밀 한 주제이지만 기본적으로 git이 배포되므로 모든 사람이 자신의 역사를 얻습니다. A는 B에게 그들의 역사 버전을 요청할 수 있지만, 누군가가 말하지 않으면 C는 그것에 대해 알지 못한다. '권한있는'이력을 저장할 단일 저장소가 있다는 것은 D가 역사를위한 정보 센터 역할을한다는 것을 의미합니다. 따라서 A는 D에게 변경 사항을 알려주고 B와 C는 자신들 사이에서 부 채널 작업을 수행하지 않고 D와 대화하여 최신 상태를 유지하는 것을 알고 있습니다. 예를 들어, OP의 서버가 C이고 플래시 드라이브가 D 인 경우 서버가 A / B 상호 작용에서 벗어나지 않도록합니다.
Iron Gremlin

6
@LightnessRacesinOrbit 여기서 중요한 것은 권위를 의미 할 필요는 없으며, 그 맥락에서 유용합니다. 예를 들어, 작업 트리가없고 디스크 공간 (또는 대역폭)이 더 작기 때문에 유용합니다. 이것은 지금보다 훨씬 더 중요한 지옥 이었지만 여전히 등장합니다.
Iron Gremlin

46

A의 단일 컴퓨터, 특별한 아무것도 필요하지 않습니다. git init원하는 디렉토리에서 실행 하고 평상시처럼 Git을 사용하십시오.

여러 컴퓨터에서 저장소를 동기화하는 방법에는 여러 가지가 있습니다.

방법 1a (네트워크가 전혀 없음) : USB 스틱에 '베어 리포지토리'를 만든 다음 다른 원격 리포지토리와 마찬가지로 밀어서 가져옵니다. 즉, 로컬 경로를 통한 리포지토리 작업은 SSH 또는 HTTPS URL을 통한 작업과 다르지 않습니다.

  1. '원격'저장소를 작성하십시오.

    $ git init --bare /mnt/Stick/Repositories/Large_Project.git
    
  2. 컴퓨터 1에서 모든 것을 밀어 넣으십시오.

    $ cd ~/Large_Project
    $ git remote add usb /mnt/Stick/Repositories/Large_Project.git
    $ git push usb master
    
  3. 컴퓨터 2에서도 항상 그렇습니다.

    $ git remote add usb /mnt/Stick/Repositories/Large_Project.git
    $ git pull usb
    

(URL이나 경로에서 직접 푸시 / 페치 / 풀을 할 수도 있습니다.)

방법 1b (내부 네트워크) : SSH를 사용할 수있는 내부 서버가 있고 Git이 설치된 경우 위와 동일하게 수행 할 수 있습니다 . [user@]host:path또는 ssh://[user@]host/path구문을 사용하여 SSH 주소를 지정하면 됩니다.

  1. git init --bare <somepath.git>SSH를 통해 지정된 서버에서 실행하여 '원격'리포지토리를 만듭니다 .

  2. 컴퓨터 1에서 앞에서 설명한 것과 같은 방식으로.

    $ git remote add origin myserver.example.com:Gits/Large_Project.git
    

    또는 원하는 경우 :

    $ git remote add origin ssh://myserver.example.com/Gits/Large_Project.git
    
  3. 컴퓨터 2에서 방법 1a와 동일합니다.


방법 2 : 주어진 커밋 목록을 단일 파일로 보관하는 '전송 번들'을 만들 수 있습니다.

불행히도 번들 명령은 마지막에 이미 번들로 제공된 것을 자동으로 기억하지 않으므로 수동 태그 지정 또는 메모 유지가 필요합니다. git-bundle 매뉴얼에서 예제를 보자.

  1. 컴퓨터 1에서 전체 분기의 번들을 작성하십시오.

    $ cd ~/Large_Project
    $ git bundle create /mnt/Stick/Project.bundle master
    $ git tag -f last-bundled master
    
  2. 컴퓨터 2에서 번들이 저장소 인 것처럼 번들에서 가져 오십시오.

    $ cd ~/Large_Project
    $ git pull /mnt/Stick/Project.bundle
    

후속 번들은 전체를 포장 할 필요가 없습니다 . 대신 master새로 추가 된 커밋 만 포장 할 수 있습니다 last-bundled..master.

  1. 컴퓨터 1에서 새로 추가 된 커밋 번들을 작성하십시오.

    $ cd ~/Large_Project
    $ git bundle create /mnt/Stick/Project.bundle last-bundled..master
    $ git tag -f last-bundled master
    
  2. 같은 상기와.


실제로 내 목적으로는 나쁘지 않을 것입니다. 또한 모든 저장소에는 전체 히스토리가 있으므로 git에서는 아무것도 "기본"이 아니므로 문제가 생길 때마다 다시 만들 수 있습니다.
Tutu Kaeen

manual tagging or note-keeping is needed, repo가 ​​매우 크지 않은 한 가지 옵션은 다음 git bundle create my.bundle --all과 같습니다. , 모든 것을 포함해야합니다
birdspider

나는 받아 들인 대답과 같은 말을하지만 더 설명하기 때문에이 대답을 더 좋아합니다.
Rystraum

"베어"옵션의 중요성은 무엇입니까?
궤도에서 가벼움 경주

1
그것은이다 저장소 생성 단지 (당신이 보통에서 발견했던 것과 데이터베이스 .git/는 '작업 트리'(편집 가능한 파일)없이, 숨김 폴더). 리포지토리에 가장 적합한 형식입니다 git push.
grawity

20

git bundle create

방법 중 하나는 외부 저장소를 사용하여 리포지토리간에 데이터를 교환하는 것입니다 .git 번들 입니다. 이렇게하면 중간 Git 리포지토리가 아닌 각 전송마다 단일 파일 만 있습니다.

각 "git push"는 파일 생성으로 바뀌고 "git fetch"는 해당 파일에서 항목을 가져옵니다.

데모 세션

첫 번째 저장소 작성 및 첫 번째 "푸시"수행

gitbundletest$ mkdir repo1

gitbundletest$ cd repo1

repo1$ git init
Initialized empty Git repository in /tmp/gitbundletest/repo1/.git/
repo1$ echo 1 > 1 && git add 1 && git commit -m 1
[master (root-commit) c8b9ff9] 1
 1 file changed, 1 insertion(+)
 create mode 100644 1

repo1$ git bundle create /tmp/1.bundle master HEAD
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 384 bytes | 384.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)

두 번째 저장소 (예 : 두 번째 컴퓨터)에 "복제":

gitbundletest$ git clone /tmp/1.bundle repo2
Cloning into 'repo2'...
Receiving objects: 100% (3/3), done.

gitbundletest$ cd repo2/

repo2$ cat 1
1

일부 변경 사항을 수행하여 다른 번들 파일로 "푸시"하십시오.

repo2$ echo 2 > 1 && git add 1 && git commit -m 2
[master 250d387] 2
 1 file changed, 1 insertion(+), 1 deletion(-)

repo2$ git bundle create /tmp/2.bundle origin/master..master origin/HEAD..HEAD
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 415 bytes | 415.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)

첫 번째 저장소에 대한 "풀링"변경 사항 :

repo2$ cd ../repo1

repo1$ git pull /tmp/2.bundle 
Receiving objects: 100% (3/3), done.
From /tmp/2.bundle
 * branch            HEAD       -> FETCH_HEAD
Updating c8b9ff9..250d387
Fast-forward
 1 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

repo1$ cat 1
2

첫 번째 번들과 달리 두 번째 번들에는 부분 Git 히스토리 만 포함되며 직접 복제 할 수 없습니다.

repo1$ cd ..

gitbundletest$ git clone /tmp/2.bundle repo3
Cloning into 'repo3'...
error: Repository lacks these prerequisite commits:
error: c8b9ff94942039469fa1937f6d38d85e0e39893a 
fatal: bad object 250d38747656401e15eca289a27024c61e63ed68
fatal: remote did not send all necessary objects

번들을 사용할 경우 각 번들에 포함 할 커밋 범위를 수동으로 지정해야하는 단점이 있습니다. 달리 git push, git bundle이전 번들에 무엇을 추적하지 않습니다, 당신은 수동으로 조정해야 refs/remotes/origin/master하거나 번들이 될 수있는 것보다 더 큰 것입니다.


--all모든 것을 얻기 위해 깃발 을 언급하는 것을 잊지 마십시오 . 레포가 충분히 작 으면 매번 모든 것을 옮기기 때문에 가장 간단한 과정입니다! 메모리 스틱을 풀지 마십시오. 아마도 가장 큰 보안 문제 일 것입니다!
Philip Oakley

7

먼저 Git을 설치해야합니다 . 그런 다음 새 저장소를 작성하려면 복사 한 폴더 내에서 실행하십시오.

git init

그런 다음 버전 관리를 원하는 파일을 git add추가 -a하고 (모든 파일에 추가 ) 변경 내용 커밋을 시작할 수 있습니다 ( git commit).

지역 기록 ( git log) 에서 작업 할 수 있으므로 리모컨을 누를 필요가 없습니다 .

자세한 내용은 다음을 확인하십시오.


인터넷없이 밀고 당기기

git push명령을 사용하면 SSH를 통해 로컬 연결, 인트라넷을 사용하여 푸시 할 수 있습니다.

git remote add server ssh://[user@]host.xz[:port]/path/to/dev/repo.git/
git push server

또는 폴더로 밀어 넣으십시오.

git push /mnt/usb/my_repo

이것은 두 개의 저장소 사본이 있다고 가정합니다.

당기기와 동일

git pull /mnt/usb/my_repo

패치

패치를 적용하려면 patchcommand 또는을 사용하십시오 git apply.

참조 : 자식 저장소에서 패치 나 DIFF 파일을 만들고 또 다른 자식 저장소에 적용 .


5

로컬에서도 Git을 사용할 수 있습니다. 그런 다음 커밋은 로컬로만 저장되며 여전히 버전 제어가 가능하며 (확산 / 병합 등) 다른 컴퓨터에서 리포지토리에 액세스 할 수는 없습니다.

git init로컬 폴더에서 실행하여 로컬 Git 저장소를 시작할 수 있습니다 . 여기에 설명 된대로 .


3
알고 있지만 다른 컴퓨터에서 작업하여 인터넷에 액세스 할 수없는 서버의 파일에 적용하고
싶습니다

2
@TutuKaeen 플래시 드라이브에 리포지토리가 있고 다른 컴퓨터의 하드 드라이브로 복제 / 동기화하는 데 아무런 문제가 없습니다. 그러나 "인터넷에 액세스 할 수없는 서버"는 이상하게 들립니다. 서버의 목표는 서비스를 제공하는 것입니다. 대부분의 경우 서비스는 네트워킹과 관련이 있습니다 (항상 그런 것은 아닙니다).
AnonymousLurker

2
@dhae-Git을 로컬로 사용하는 방법에 대한 자세한 내용을 잠시 기다려주십시오. 할 수 있다는 것을 나타내는 것만으로는 도움이되지 않습니다.
Ramhound

2
@anonymousLurker는 매우 중요한 기관의 폐쇄 네트워크에 데이터를 제공하고 있습니다. 데이터가 매우 정교하고 직원에게만 제공되기 때문에 광대역 인터넷에는 아무 것도 제공하지 않습니다.
Tutu Kaeen

1
@TutuKaeen :이 경우 모든 네트워크 액세스를, 당신은 항상 SSH를 통해 자신의 망할 놈의 서버를 실행할 수 있습니다. GitHub보다 Git에 더 많은 것이 있습니다.
grawity
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.