Diff 작업하기
머지 리퀘스트의 diff를 처리하는 아키텍처, 한도 설정, Viewer 구조, HEAD 기반 비교 방식을 설명합니다.
이 페이지는 diff에 관한 개발자 문서입니다. 사용자 문서는 머지 리퀘스트의 Diff 를 참조하세요. diff를 표시하기 위해 다양한 소스를 활용합니다. 여기에는 다음이 포함됩니다: Gitaly 서비스 데이터베이스( merge_request_diff_files 를 통해) Redis(캐시된 하이라이트 diff) 아키텍처 개요 # 머지 리퀘스트 diff # 머지 리퀘스트를 갱신할 때(소스 브랜치에 푸시하거나, 타깃 브랜치에 강제 푸시하거나, 타깃 브랜치에 MR의 커밋이 포함된 경우) Gitlab::Git::Compare 를 사용하여 비교 정보를 가져옵니다. 이 메서드는 Gitaly를 통해 base 및 head 데이터를 가져오고, Gitlab::Git::Diff.between 을 통해 두 사이의 diff를 계산합니다. diff 가져오기 프로세스는 일련의 상수 값을 통해 단일 파일 diff 크기와 전체 diff의 크기를 제한 합니다. 원시 diff 파일은 이후 merge_request_diff_files 테이블에 저장됩니다. ApplicationSettings#diff_max_patch_bytes 값의 10%를 초과하는 diff는 접혀 표시되지만, PostgreSQL에는 여전히 보관됩니다. 그러나 정의된 안전 한도 를 초과하는 diff 파일 ( Diff 한도 섹션 참조)은 데이터베이스에 저장되지 않습니다 . 머지 리퀘스트 diff 페이지에 diff 정보를 표시하기 위해 다음 작업을 수행합니다: 데이터베이스 merge_request_diff_files 에서 모든 diff 파일 가져오기 이전 및 새 파일 blob을 일괄 가져오기: 이전 및 새 파일 콘텐츠 하이라이트 각 파일에 사용할 Viewer 결정(텍스트, 이미지, 삭제됨 등) 파일 콘텐츠 변경 여부 확인 외부에 저장되었는지 확인 스토리지 오류 발생 여부 확인 diff 파일이 캐시 가능한 경우(텍스트 기반), Gitlab::Diff::FileCollection::MergeRequestDiff 를 사용하여 Redis에 캐시됨 노트 diff # diff에 댓글을 달 때(임의의 비교), 잘린 diff 버전을 NoteDiffFile 에 저장합니다( DiffNote 와 연결됨). 따라서 파일의 diff가 필요할 때마다 리포지터리에 접근하는 대신 다음 순서로 처리합니다: NoteDiffFile#diff 가 저장되어 있는지 확인하고 사용 그렇지 않고 현재 MR 리비전인 경우, 저장된 MergeRequestDiffFile#diff 사용 마지막 수단으로 리포지터리에 직접 접근하여 diff 가져오기 Diff 한도 # 위에서 설명했듯이, 단일 diff 파일과 전체 diff의 크기를 제한합니다. diff 파일이 접혀 표시되는 경우와 전혀 표시되지 않고 사용자가 Blob 뷰로 안내되는 경우가 있습니다. Diff 컬렉션 한도 # 모든 diff 파일 컬렉션에 적용되는 한도입니다. 파일 수, 줄 수, 파일 크기를 고려합니다. Gitlab::Git::DiffCollection.collection_limits[:safe_ma