소개
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 시간 초과는 일반적으로 다음 범주로 분류됩니다.
- HTTP/HTTPS 시간 초과: HTTP/HTTPS 프로토콜을 사용할 때 발생합니다.
- SSH 시간 초과: Git 리포지토리에 연결하기 위해 SSH 를 사용할 때 발생합니다.
- 네트워크 시간 초과: 컴퓨터와 Git 서버 간의 일반적인 연결 문제입니다.
다음 단계에서는 이러한 시간 초과를 보다 효과적으로 처리하도록 Git 을 구성합니다.
Git 타임아웃 설정 구성
Git 타임아웃에 대해 이해했으므로, 이제 연결 문제를 더 잘 처리하도록 Git 을 구성해 보겠습니다. Git 은 다양한 연결 유형에 대한 타임아웃을 관리하기 위해 여러 구성 옵션을 제공합니다.
HTTP 타임아웃 값 설정
http.timeout 설정은 Git 이 HTTP 요청을 할 때 응답을 기다리는 시간을 제어합니다. 기본값은 느린 연결의 경우 너무 짧을 수 있습니다. 이 값을 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
Git 사용자 정보 설정
Git 저장소에 변경 사항을 커밋하려면 먼저 사용자 정보를 구성해야 합니다. 이는 누가 커밋을 수행하는지 Git 이 알기 위해 필요합니다.
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
이 설정들이 올바르게 적용되었는지 확인하려면 다음을 실행합니다.
git config --global user.name
git config --global user.email
출력으로 구성한 이름과 이메일 주소가 표시되어야 합니다.
연습을 위한 테스트 저장소 생성
연습을 위해 작은 테스트 저장소를 만들어 보겠습니다.
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 git@github.com:git/git.git
git remote -v
이제 출력은 SSH URL 을 표시해야 합니다.
origin git@github.com:git/git.git (fetch)
origin git@github.com: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) 을 살펴보세요.



