인터넷 연결이 좋지 않은 위치에 대규모 데이터 세트 A와 B의 두 개의 복제본이 있다고 가정합니다. 경험상 메타데이터는 전송할 수 있지만 실제 파일 데이터는 전송할 수 없다고 가정하지만 완전한 오프라인 솔루션이 더 좋습니다. 복사본 중 하나는 기본 복사본이고 다른 하나는 반정기적으로 업데이트해야 하는 백업입니다.
두 데이터 세트를 동기화하는 방식은... 구식입니다. 누군가 업데이트해야 하는 파일을 외부 드라이브에 복사하고 A에서 B로 물리적으로 이동한 다음 다른 복사본에서 파일을 업데이트합니다. 그러나 특히 파일 손상과 같은 오류 상황에서는 어떤 파일을 전송해야 하는지 추적하는 것이 점점 더 어려워지고 있습니다.
외부 드라이브에 데이터세트의 전체 복사본을 저장하는 것은 용량보다 최소한 한 단계 더 크기 때문에 비현실적입니다. 일반적인 파일 크기는 수 기가바이트이며, 가까운 미래에 전체 데이터 세트가 수십 테라바이트 미만으로 늘어나서는 안 됩니다. 일반적인 업데이트는 파일 추가이며, 기존 파일의 업데이트 및 삭제는 매우 드뭅니다.
가장 중요한 것은 보존되는 바이트입니다. 일관되지 않은 타임스탬프나 파일 권한은 신경 쓰지 않습니다.
복사본 B의 파일 체크섬을 휴대용 드라이브에 수동으로 저장하고 복사본 A에서 불일치를 확인할 수 있습니다. 그런데 나와 비슷한 사용 사례를 지원하는 성숙한 도구가 있나요?
감사해요!
답변1
rsync(1)을 살펴보십시오. 이는 이러한 종류의 작업을 위해 설계되었습니다.
diff(1)/patch(1)(또는차이점도구) 변경 사항이 현지화되었음을 알고 있는 경우.
데이터의 구조와 변경 사항을 이해하면 몇 가지 전문 도구를 찾을 수 있습니다. 하지만 이는 더 많은 작업이고 취약하며 변화에 따라 성장하지 않습니다.
디렉터리가 대부분 텍스트 파일인 경우 이를 git(1) 저장소로 설정하고 거기에서 가져오는 것도 실용적인 솔루션일 수 있습니다(변경 사항을 효율적으로 가져오고 통합하는 데 최적화되어 있습니다).
답변2
git 패치 파일을 보셨나요? A 위치와 B 위치가 모두 git 리포지토리인 경우 생성된 git 패치 파일을 외부 드라이브에 복사하여 백업 위치에 적용하면 됩니다.
환매 계약 A:
commit 090d683743b24d4fd93cdf2c1fc3fe3613443be0 (HEAD -> master)
Author: somebody <[email protected]>
Date: Thu Jun 20 19:01:14 2019 -0400
added my love for bananas
commit b58c37b8479ce188c896719336a456d168c56ea9
Author: somebody <[email protected]>
Date: Thu Jun 20 18:57:57 2019 -0400
initial commit
환매 계약 B:
commit b58c37b8479ce188c896719336a456d168c56ea9 (HEAD -> master, origin/master, origin/HEAD)
Author: somebody <[email protected]>
Date: Thu Jun 20 18:57:57 2019 -0400
initial commit
이제 git을 사용하여 패치 파일을 생성할 수 있습니다.
git diff -p commit_old commit_new > /external_drive/patch.diff
저장소 B에서:
변경 사항을 보려면:
git apply --stat patch.diff
변경 사항을 적용하려면:
git apply patch.diff
변경 사항을 추가하고 커밋합니다.
git add -A
git commit -m "added my love for bananas to this directory"
새 커밋 보기:
git log
commit 4122e3deca160a9167fb54456bb688394aa5dcff (HEAD -> master)
Author: somebody <[email protected]>
Date: Thu Jun 20 19:10:19 2019 -0400
added my love for bananas to this directory
commit b58c37b8479ce188c896719336a456d168c56ea9 (origin/master, origin/HEAD)
Author: somebody <[email protected]>
Date: Thu Jun 20 18:57:57 2019 -0400
initial commit