git 상태 성능을 개선하는 방법
NFS에있는 Linux 시스템에 10GB의 저장소가 있습니다. 처음 git status
에는 36 분이 git status
걸리고 이후 에는 8 분이 걸립니다. Git은 파일 캐싱을 위해 OS에 의존하는 것 같습니다. 첫 번째 git
명령은 좋아 commit
, status
그 / 팩을 포함 전체의 repo 거대한 환매 특약을 위해 매우 오랜 시간이 걸립니다 재 포장. git status
그렇게 큰 저장소를 사용했는지 확실하지 않지만이 문제를 겪은 사람이 있습니까?
나는 시도 git gc
, git clean
, git repack
하지만 걸리는 시간은 여전히 / 거의 같은.
하위 모듈이나 저장소를 더 작은 것으로 나누는 것과 같은 다른 개념이 도움이 될까요? 그렇다면 더 큰 저장소를 분할하는 것이 가장 좋습니다. 큰 저장소에서 git 명령에 걸리는 시간을 개선하는 다른 방법이 있습니까?
더 정확하게 말하면 git은 lstat(2)
시스템 호출 의 효율성에 의존 하므로 클라이언트의 "attribute cache timeout"을 조정 하는 것이 트릭을 수행 할 수 있습니다.
에 대한 매뉴얼 ( git-update-index
기본적으로 수동 모드) 은 플래그 를 사용하여 정상적인 동작을 억제하고 변경 한 경로를 수동으로 업데이트 git-status
함으로써이를 완화하기 위해 수행 할 수있는 작업을 설명합니다 . 파일을 저장할 때마다이 플래그를 설정 해제하도록 편집기를 프로그래밍 할 수도 있습니다.--assume-unchanged
대안은 체크 아웃 크기를 줄이는 것입니다 (팩 파일의 크기는 여기에서 실제로 작동하지 않습니다). 옵션은 스파 스 체크 아웃, 하위 모듈 또는 Google의 저장소 도구입니다.
( NFS와 함께 Git을 사용하는 것에 대한 메일 링리스트 스레드가 있지만 많은 질문에 대답하지 않습니다.)
NFS를 통해 공유되는 대규모 프로젝트에서도이 문제가 발생합니다.
git commit과 git status 모두에 제공 할 수있는 플래그 -uno 를 발견하는 데 시간이 좀 걸렸습니다 .
이 플래그가하는 일은 추적되지 않는 파일 찾기를 비활성화하는 것입니다. 이렇게하면 nfs 작업 수가 크게 줄어 듭니다. 그 이유는 git이 추적되지 않은 파일을 발견하려면 모든 하위 디렉터리를 찾아야하므로 하위 디렉터리가 많으면 해를 입힐 수 있습니다. 추적되지 않는 파일을 찾지 못하도록 git을 비활성화하면 이러한 모든 NFS 작업이 제거됩니다.
이것을 core.preloadindex 플래그와 결합하면 NFS에서도 뛰어난 성능을 얻을 수 있습니다.
git gc 사용해보십시오 . 또한 git clean 이 도움이 될 수 있습니다.
업데이트 -반대표가 어디서 왔는지 확실하지 않지만 git 매뉴얼에는 구체적으로 다음과 같이 명시되어 있습니다.
파일 개정을 압축 (디스크 공간을 줄이고 성능을 높이기 위해 )하고 git add의 이전 호출에서 생성되었을 수있는 도달 할 수없는 객체를 제거하는 등 현재 저장소 내에서 여러 가지 관리 작업을 실행합니다 .
사용자는 좋은 디스크 공간 활용도와 우수한 운영 성능을 유지하기 위해 각 저장소 내에서이 작업을 정기적으로 실행하는 것이 좋습니다.
git 상태가 느릴 때 git gc를 실행 한 후 항상 차이를 발견합니다!
업데이트 II- 내가 이것을 어떻게 놓쳤는 지 확실하지 않지만 OP는 이미 시도 git gc
하고 git clean
. 나는 그것이 원래 거기에 없었 음을 맹세하지만 편집에 어떤 변화도 보이지 않습니다. 그 죄송합니다!
git 저장소가 하위 모듈을 많이 사용하는 경우 .git 디렉토리의 구성 파일을 편집하고 ignore = dirty
특별히 크거나 무거운 하위 모듈을 설정 하여 git 상태의 성능을 크게 높일 수 있습니다 . 예를 들면 :
[submodule "mysubmodule"]
url = ssh://mysubmoduleURL
ignore = dirty
잊었을 수있는 하위 모듈에 단계적이지 않은 변경 사항이 있다는 알림의 편리함을 잃게되지만 하위 모듈이 주 저장소와 동기화되지 않은 경우를 아는 주된 편의는 여전히 유지됩니다. 또한 작업 디렉토리를 하위 모듈 자체로 변경하고 평소와 같이 git status를 사용하여 더 많은 정보를 볼 수 있습니다. 참조 이 질문에 무엇을 "더러운"수단에 대한 자세한 내용을.
Git 상태의 성능은 Git 2.13 (2017 년 2 분기)에서 개선 될 것입니다.
Jeff Hostetler ( )의 commit 950a234 (2017 년 4 월 14 일)를 참조하십시오 . (Merged by Junio C Hamano -- in commit 8b6bba6 , 24 Apr 2017)jeffhostetler
gitster
> string-list
: 재 할당시 ALLOC_GROW
매크로 사용string_list
배열을
ALLOC_GROW()
재 할당 할 때string_list
단순히 32만큼 늘리기보다는 매크로를 사용하십시오 .
이것은 성능 최적화입니다.매우 큰 리포지토리의 상태와 많은 변경 사항이있는 동안 총 실행 시간의 상당 부분이
wt_status.changes
어레이를 재 할당하는 데 소비 됩니다 .이 변경으로
wt_status_collect_changes_worktree()
매우 큰 저장소에서 시간이 125 초에서 45 초로 단축됩니다.
또한 Git 2.17 (2018 년 2 분기)은 인덱스가 많은 작업에서 시간이 소비되는 위치를 측정하기위한 새로운 추적을 도입합니다.
Nguyễn Thái Ngọc Duy ( )의 commit ca54d9b (2018 년 1 월 27 일)를 참조하십시오 . (Merged by Junio C Hamano -- in commit 090dbea , 15 Feb 2018)pclouds
gitster
trace
: 인덱스가 많은 작업에서 시간이 소요되는 위치 측정알려진 모든 무거운 코드 블록이 측정됩니다 (객체 데이터베이스 액세스 제외). 이는 최적화가 효과적인지 여부를 식별하는 데 도움이됩니다.
최적화되지 않은 git-status는 다음과 같습니다.
0.001791141 s: read cache ...
0.004011363 s: preload index
0.000516161 s: refresh index
0.003139257 s: git command: ... 'status' '--porcelain=2'
0.006788129 s: diff-files
0.002090267 s: diff-index
0.001885735 s: initialize name hash
0.032013138 s: read directory
0.051781209 s: git command: './git' 'status'
동일한 Git 2.17 (2018 년 2 분기)이 다음 git status
과 같이 개선 되었습니다.
commit f39a757, commit 3ca1897, commit fd9b544, commit d7d1b49 (09 Jan 2018) by Jeff Hostetler (
jeffhostetler
).
(Merged by Junio C Hamano --gitster
-- in commit 4094e47, 08 Mar 2018)
"git status
" can spend a lot of cycles to compute the relation between the current branch and its upstream, which can now be disabled with "--no-ahead-behind
" option.commit ebbed3b (25 Feb 2018) by Derrick Stolee (
derrickstolee
).
revision.c
: reduce object database queriesIn
mark_parents_uninteresting()
, we check for the existence of an object file to see if we should treat a commit as parsed. The result is to set the "parsed" bit on the commit.Modify the condition to only check
has_object_file()
if the result would change the parsed bit.When a local branch is different from its upstream ref, "
git status
" will compute ahead/behind counts.
This usespaint_down_to_common()
and hitsmark_parents_uninteresting()
.On a copy of the Linux repo with a local instance of "master" behind the remote branch "
origin/master
" by ~60,000 commits, we find the performance of "git status
" went from 1.42 seconds to 1.32 seconds, for a relative difference of -7.0%.
Git 2.24 (Q3 2019) proposes another setting to improve git status
performance:
See commit aaf633c, commit c6cc4c5, commit ad0fb65, commit 31b1de6, commit b068d9a, commit 7211b9e (13 Aug 2019) by Derrick Stolee (derrickstolee
).
(Merged by Junio C Hamano -- gitster
-- in commit f4f8dfe, 09 Sep 2019)
repo-settings: create feature.manyFiles setting
The
feature.manyFiles
setting is suitable for repos with many files in the working directory.
By settingindex.version=4
andcore.untrackedCache=true
, commands such as 'git status
' should improve.
git config --global core.preloadIndex true
Did the job for me. Check the official documentation here.
20-30 개의 서브 모듈 범위에있는 코드베이스에서
git status --ignore-submodules
저를 위해 엄청난 속도를 냈습니다. 이것은 하위 모듈의 상태에 대해보고하지 않습니다 .
아직 언급되지 않은 것은 Windows 컴퓨터에서 파일 시스템 캐시를 활성화하는 것입니다 (리눅스 파일 시스템은 완전히 다르며 git이 최적화되었으므로 아마도 Windows에서만 도움이 될 것입니다).
git config core.fscache true
최후의 수단으로 git이 여전히 느리면 수정 시간 검사를 끌 수 있으며 git은 어떤 파일이 변경되었는지 알아 내야합니다.
git config core.ignoreStat true
하지만 변경된 파일은 나중에 개발자 자신이 git add
. Git은 자체적으로 변경 사항을 찾지 못합니다.
참고 URL : https://stackoverflow.com/questions/4994772/ways-to-improve-git-status-performance
'Program Tip' 카테고리의 다른 글
XML에서 요소 또는 속성을 사용해야합니까? (0) | 2020.11.01 |
---|---|
한 분기를 다른 분기처럼 만드는 git 명령 (0) | 2020.11.01 |
JavaScript for-loop를 CoffeeScript로 어떻게 변환 할 수 있습니까? (0) | 2020.11.01 |
이미지를 나타내는 numpy 배열 리샘플링 (0) | 2020.11.01 |
명령 줄을 사용하여 디렉토리와 파일을 삭제하지만 존재하지 않는 경우 오류가 발생하지 않습니다. (0) | 2020.11.01 |