Git 연결 시간 초과 문제 해결 방법

GitGitBeginner
지금 연습하기

💡 이 튜토리얼은 영어로 번역되었습니다. 원본을 보려면 영어로 전환

소개

Git 연결 시간 초과는 버전 관리 시스템으로 작업하는 개발자에게 좌절감을 주는 장애물이 될 수 있습니다. 이러한 시간 초과는 일반적으로 리포지토리를 복제 (cloning), 풀 (pull) 또는 푸시 (push) 하는 것과 같은 네트워크 작업 중에 발생합니다. 이 랩에서는 Git 연결 시간 초과의 원인을 이해하고 이를 해결하기 위한 실질적인 솔루션을 제공합니다.

이 랩을 마치면 일반적인 시간 초과 문제를 진단하고, Git 시간 초과 설정을 구성하며, Git 워크플로우에서 네트워크 관련 문제를 극복하기 위한 효과적인 전략을 구현할 수 있습니다.

Git 시간 초과 이해

Git 시간 초과는 네트워크 작업이 미리 정의된 시간 제한보다 오래 걸릴 때 발생합니다. 해결책을 살펴보기 전에 시간 초과의 유형과 이를 식별하는 방법을 이해하는 것이 중요합니다.

일반적인 시간 초과 오류 메시지

존재하지 않는 리포지토리에서 복제 (clone) 를 시도하여 Git 시간 초과를 시뮬레이션해 보겠습니다.

git clone https://github.com/non-existent-user/non-existent-repo.git

다음과 유사한 오류 메시지가 표시될 것입니다.

Cloning into 'non-existent-repo'...
fatal: repository 'https://github.com/non-existent-user/non-existent-repo.git/' not found

이 특정 오류는 시간 초과가 아닌 누락된 리포지토리와 관련이 있지만, 실제 시간 초과 오류는 다음과 같이 보일 수 있습니다.

fatal: unable to access 'https://github.com/user/repo.git/': Failed to connect to github.com port 443: Connection timed out

Git 구성 확인

현재 Git 구성에 이미 시간 초과 설정이 정의되어 있을 수 있습니다. 확인해 보겠습니다.

git config --list | grep timeout

결과가 없으면 사용자 지정 시간 초과 값을 아직 설정하지 않았음을 의미합니다.

네트워크 연결 테스트

네트워크 문제는 Git 시간 초과의 가장 일반적인 원인입니다. GitHub 에 대한 연결을 테스트해 보겠습니다.

ping -c 4 github.com

출력은 성공적인 ping 응답을 표시해야 합니다.

PING github.com (140.82.121.3) 56(84) bytes of data.
64 bytes from 140.82.121.3: icmp_seq=1 ttl=47 time=147 ms
64 bytes from 140.82.121.3: icmp_seq=2 ttl=47 time=147 ms
64 bytes from 140.82.121.3: icmp_seq=3 ttl=47 time=147 ms
64 bytes from 140.82.121.3: icmp_seq=4 ttl=47 time=147 ms

--- github.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 147.129/147.206/147.249/0.045 ms

이제 좀 더 구체적인 HTTP 요청을 시도해 보겠습니다.

curl -I https://github.com

이것은 HTTP 헤더 정보를 반환해야 합니다.

HTTP/2 200
server: GitHub.com
date: Thu, 28 Sep 2023 12:34:56 GMT
content-type: text/html; charset=utf-8
cache-control: no-cache
vary: X-Requested-With, Accept-Encoding, Accept, X-Requested-With
...

이러한 테스트는 기본적인 네트워크 연결이 문제인지 또는 문제가 Git 작업과 관련된 것인지 확인하는 데 도움이 됩니다.

Git 시간 초과 유형

Git 시간 초과는 일반적으로 다음 범주로 분류됩니다.

  1. HTTP/HTTPS 시간 초과: HTTP/HTTPS 프로토콜을 사용할 때 발생합니다.
  2. SSH 시간 초과: Git 리포지토리에 연결하기 위해 SSH 를 사용할 때 발생합니다.
  3. 네트워크 시간 초과: 컴퓨터와 Git 서버 간의 일반적인 연결 문제입니다.

다음 단계에서는 이러한 시간 초과를 보다 효과적으로 처리하도록 Git 을 구성합니다.

Git 시간 초과 설정 구성

이제 Git 시간 초과를 이해했으므로 연결 문제를 더 잘 처리하도록 Git 을 구성해 보겠습니다. Git 은 다양한 연결 유형에 대한 시간 초과를 관리하기 위한 여러 구성 옵션을 제공합니다.

HTTP 시간 초과 값 설정

http.timeout 설정은 HTTP 요청을 할 때 Git 이 응답을 기다리는 시간을 제어합니다. 기본값은 느린 연결의 경우 너무 짧을 수 있습니다. 이를 300 초로 늘려 보겠습니다.

git config --global http.timeout 300

설정이 올바르게 적용되었는지 확인하려면 다음을 수행합니다.

git config --global http.timeout

다음 출력이 표시되어야 합니다.

300

SSH 연결 시간 초과 구성

SSH 연결의 경우 지정된 연결 시간 초과와 함께 Git 이 사용하는 SSH 명령을 구성할 수 있습니다.

git config --global core.sshCommand "ssh -o ConnectTimeout=30"

이렇게 하면 SSH 연결 시간 초과가 30 초로 설정됩니다. 이 설정을 확인하려면 다음을 수행합니다.

git config --global core.sshCommand

다음이 표시되어야 합니다.

ssh -o ConnectTimeout=30

저속 제한 구성

Git 을 사용하면 저속 연결에 대한 제한을 설정할 수도 있습니다. 이는 불안정한 네트워크를 처리할 때 유용할 수 있습니다.

git config --global http.lowSpeedLimit 1000
git config --global http.lowSpeedTime 10

이러한 명령은 전송 속도가 10 초 동안 초당 1000 바이트 미만으로 떨어지면 연결을 중단하도록 Git 을 구성합니다. 이러한 설정을 확인하려면 다음을 수행합니다.

git config --global http.lowSpeedLimit
git config --global http.lowSpeedTime

예상 출력:

1000
10

연습을 위한 테스트 리포지토리 생성

연습을 위해 작은 테스트 리포지토리를 만들어 보겠습니다.

mkdir ~/project/test-repo
cd ~/project/test-repo
git init

빈 Git 리포지토리가 초기화되었음을 나타내는 출력이 표시되어야 합니다.

Initialized empty Git repository in /home/labex/project/test-repo/.git/

이제 간단한 파일을 만들고 커밋합니다.

echo "This is a test file." > test.txt
git add test.txt
git commit -m "Initial commit"

커밋 출력은 다음과 같아야 합니다.

[main (root-commit) xxxxxxx] Initial commit
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt

이 로컬 리포지토리는 다음 단계에서 Git 구성 변경 사항을 테스트하는 데 유용합니다.

일반적인 시간 초과 문제 해결

Git 구성을 완료했으므로 일반적인 시간 초과 시나리오와 이를 해결하는 방법을 살펴보겠습니다. 실제 상황에서 적용할 수 있는 실용적인 해결책을 살펴보겠습니다.

자세한 출력과 함께 Git 사용

시간 초과가 발생할 때 Git 이 수행하는 작업에 대한 자세한 정보를 확인하는 것이 도움이 됩니다. 자세한 플래그는 통찰력을 제공할 수 있습니다.

cd ~/project/test-repo
GIT_CURL_VERBOSE=1 git fetch

원격 저장소가 없는 로컬 저장소로 작업하고 있으므로 원격이 구성되지 않았다는 오류가 표시될 수 있습니다. 이것은 예상된 동작입니다. 원격 저장소가 있는 실제 시나리오에서는 자세한 연결 정보가 표시됩니다.

대용량 리포지토리 전송 처리

대용량 리포지토리는 복제 작업 중에 시간 초과를 유발할 수 있습니다. 한 가지 해결책은 가장 최근 커밋만 가져오는 얕은 복제를 사용하는 것입니다.

cd ~/project
git clone --depth 1 https://github.com/git/git.git shallow-git-repo

이 명령은 Git 리포지토리에서 최신 커밋만 복제하여 전송 시간을 크게 줄입니다. 출력은 복제 진행 상황을 보여줍니다.

Cloning into 'shallow-git-repo'...
remote: Enumerating objects: 3941, done.
remote: Counting objects: 100% (3941/3941), done.
remote: Compressing objects: 100% (3066/3066), done.
remote: Total 3941 (delta 989), reused 2097 (delta 603), pack-reused 0
Receiving objects: 100% (3941/3941), 3.31 MiB | 2.86 MiB/s, done.
Resolving deltas: 100% (989/989), done.

이것이 실제로 얕은 리포지토리인지 확인하려면 다음을 수행합니다.

cd shallow-git-repo
git log --oneline | wc -l

출력은 작은 숫자여야 하며, 이는 몇 개의 커밋만 다운로드되었음을 나타냅니다.

1

HTTPS 와 SSH 간 전환

때로는 연결 프로토콜을 전환하면 시간 초과 문제를 해결할 수 있습니다. HTTPS 에서 SSH 로 변경하는 방법을 살펴보겠습니다.

먼저 현재 원격 URL 을 확인합니다.

cd ~/project/shallow-git-repo
git remote -v

출력은 HTTPS URL 을 표시합니다.

origin  https://github.com/git/git.git (fetch)
origin  https://github.com/git/git.git (push)

SSH 로 변경하려면 (참고: SSH 키를 설정하지 않았으므로 데모용입니다.)

git remote set-url origin [email protected]:git/git.git
git remote -v

이제 출력은 SSH URL 을 표시해야 합니다.

origin  [email protected]:git/git.git (fetch)
origin  [email protected]:git/git.git (push)

이 변경은 HTTPS 연결을 차단할 수 있는 특정 네트워크 제한을 우회하는 데 도움이 될 수 있습니다.

프록시 환경 처리

프록시 뒤에 있는 경우 Git 이 이를 사용하도록 구성할 수 있습니다.

## This is for demonstration purposes, do not run this if you are not behind a proxy
## git config --global http.proxy http://proxy.example.com:8080
## git config --global https.proxy https://proxy.example.com:8080

프록시 설정이 활성화되었는지 확인하려면 다음을 수행합니다.

git config --global http.proxy
git config --global https.proxy

프록시가 구성되지 않은 경우 출력이 없습니다.

SSL 검증 감소로 테스트

일부 기업 환경에서는 SSL 검증으로 인해 시간 초과가 발생할 수 있습니다. 보안상의 이유로 권장되지는 않지만, 테스트 목적으로 SSL 검증을 일시적으로 비활성화할 수 있습니다.

## Only use this for testing, do not leave SSL verification disabled
git config --global http.sslVerify false

설정을 확인하려면 다음을 수행합니다.

git config --global http.sslVerify

출력:

false

테스트 후에는 SSL 검증을 다시 활성화하는 것을 잊지 마십시오.

git config --global http.sslVerify true

변경 사항을 확인합니다.

git config --global http.sslVerify

출력:

true

이러한 문제 해결 기술은 다양한 시나리오에서 Git 연결 시간 초과를 해결하기 위한 포괄적인 도구 키트를 제공합니다.

고급 시간 초과 해결 전략

이 마지막 단계에서는 지속적인 Git 시간 초과 문제를 처리하기 위한 고급 전략을 살펴보겠습니다. 이러한 기술은 까다로운 네트워크 환경이나 매우 큰 리포지토리로 작업할 때 특히 유용합니다.

Git 프로토콜 직접 사용

Git 프로토콜은 때때로 HTTPS 또는 SSH 보다 빠를 수 있습니다.

cd ~/project
## Example only - do not run if you have limited bandwidth
## git clone git://github.com/git/git.git git-protocol-repo

데모 목적으로 이 시나리오를 나타내는 디렉토리를 만들어 보겠습니다.

mkdir -p ~/project/git-protocol-repo
cd ~/project/git-protocol-repo
git init
echo "Demonstration of Git protocol" > README.md
git add README.md
git commit -m "Demonstrating Git protocol"

출력은 커밋을 확인해야 합니다.

[main (root-commit) xxxxxxx] Demonstrating Git protocol
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

Sparse Checkout 구현

대용량 리포지토리의 경우 sparse checkout 을 사용하여 특정 디렉토리만 검색할 수 있습니다.

cd ~/project
mkdir sparse-checkout-demo
cd sparse-checkout-demo
git init
git remote add origin https://github.com/git/git.git
git config core.sparseCheckout true

이제 체크아웃할 디렉토리를 지정합니다.

echo "Documentation/" > .git/info/sparse-checkout

이것은 데모이고 실제로 원격에서 가져오지 않으므로 몇 가지 예제 콘텐츠를 만들어 보겠습니다.

mkdir -p Documentation
echo "This is a sparse checkout example" > Documentation/example.txt
git add Documentation
git commit -m "Demonstrating sparse checkout"

출력은 커밋을 확인해야 합니다.

[main (root-commit) xxxxxxx] Demonstrating sparse checkout
 1 file changed, 1 insertion(+)
 create mode 100644 Documentation/example.txt

네트워크 버퍼 최적화

지속적인 시간 초과 문제의 경우 네트워크 버퍼 설정을 최적화하면 도움이 될 수 있습니다. 이러한 명령은 일반적으로 루트 액세스가 필요하므로 설명만 하겠습니다.

## These commands require root access and are provided for reference only
## sudo sysctl -w net.core.rmem_max=2097152
## sudo sysctl -w net.core.wmem_max=2097152
## sudo sysctl -w net.ipv4.tcp_window_scaling=1

재시도 전략 구현

자주 시간 초과되는 Git 작업에 대한 간단한 재시도 스크립트를 만들 수 있습니다.

cd ~/project
nano git-retry.sh

nano 편집기에서 다음 내용을 추가합니다.

#!/bin/bash
## Simple retry script for Git operations

MAX_RETRIES=3
RETRY_DELAY=5

for ((i = 1; i <= MAX_RETRIES; i++)); do
  echo "Attempt $i of $MAX_RETRIES"
  git "$@" && break

  if [ $i -lt $MAX_RETRIES ]; then
    echo "Command failed, retrying in $RETRY_DELAY seconds..."
    sleep $RETRY_DELAY
  else
    echo "Maximum retries reached. Command failed."
    exit 1
  fi
done

Ctrl+O를 누르고 Enter를 누른 다음 Ctrl+X를 눌러 파일을 저장하고 종료합니다.

스크립트를 실행 가능하게 만듭니다.

chmod +x git-retry.sh

시간 초과될 수 있는 Git 작업에 이 스크립트를 사용할 수 있습니다.

## Example usage (do not run if not needed):
## ./git-retry.sh clone https://github.com/git/git.git retry-demo

데모를 위해 스크립트가 작동하는 것을 보여주기 위해 테스트 파일을 만들어 보겠습니다.

./git-retry.sh --version

그러면 Git 버전이 표시되어 스크립트가 Git 에 명령을 전달하는지 확인합니다.

git version 2.34.1

포괄적인 Git 구성 만들기

최적화된 시간 초과 설정으로 포괄적인 .gitconfig 파일을 만들어 보겠습니다.

nano ~/.gitconfig-optimized

다음 내용을 추가합니다.

[http]
    timeout = 300
    lowSpeedLimit = 1000
    lowSpeedTime = 10
    postBuffer = 157286400

[core]
    sshCommand = ssh -o ConnectTimeout=30 -o ServerAliveInterval=60

[pack]
    windowMemory = 256m
    packSizeLimit = 256m

Ctrl+O를 누르고 Enter를 누른 다음 Ctrl+X를 눌러 파일을 저장하고 종료합니다.

특정 프로젝트에 이 구성을 사용하려면 다음을 수행합니다.

cd ~/project/test-repo
git config --local include.path ~/.gitconfig-optimized

이 설정을 사용하면 최적화된 시간 초과 설정을 전역적으로 적용하는 대신 특정 리포지토리에 적용할 수 있습니다.

이러한 고급 전략은 가장 까다로운 Git 시간 초과 시나리오에 대한 솔루션을 제공하여 버전 관리 워크플로우가 원활하고 효율적으로 유지되도록 합니다.

요약

이 랩에서는 Git 연결 시간 초과를 효과적으로 처리하는 방법을 배웠습니다. 주요 내용은 다음과 같습니다.

  • 다양한 유형의 Git 시간 초과 오류와 그 원인 이해
  • 네트워크 복원력을 향상시키기 위한 Git 시간 초과 설정 구성
  • 일반적인 시간 초과 시나리오에 대한 실용적인 문제 해결 기술 구현
  • 지속적인 연결 문제에 대한 고급 전략 적용

이러한 기술은 까다로운 네트워크 환경에서도 원활한 Git 워크플로우를 유지하는 데 도움이 됩니다. 시간 초과 설정을 조정하고, 대체 연결 방법을 사용하고, 재시도 전략을 구현함으로써 중단을 최소화하고 개발 작업에 집중할 수 있습니다.

추가 학습을 위해 대용량 리포지토리를 처리하기 위한 Git LFS (Large File Storage) 와 Git 작업 주변의 프로세스를 자동화하기 위한 Git 훅 (hook) 을 살펴보세요.