# 다음 단계

다음 섹션에서는 Hugging Face Hub의 Git 저장소를 최대한 활용하는 데 도움이 될 수 있는 기능과 추가 정보를 강조합니다.

## 리포지토리를 프로그래매틱으로 관리하는 방법

Hugging Face는 [`huggingface_hub` 라이브러리를](https://huggingface.co/docs/huggingface_hub/index) 통해 Python으로 리포지토리에 접근할 수 있습니다. 리포지토리 다운로드 및 파일 업로드와 같이 살펴본 작업들은 이 라이브러리를 통해 사용할 수 있으며, 다른 유용한 함수들도 제공합니다!

git을 직접 사용하려는 경우, 아래 섹션을 참고하세요.

## Git에 대해 더 알아보기

Git에 대해 더 배우고 싶다면 [이 Git 튜토리얼](https://learngitbranching.js.org/)을 방문하는 것이 좋습니다. Git에 대한 더 자세한 배경 지식을 원하시면 [GitHub의 Git 가이드](https://github.com/git-guides)를 참고할 수 있습니다.

## 브랜치 사용 방법

Git 저장소를 효과적으로 협업하고, 조기에 코드를 릴리스하지 않으면서 기능을 개발하려면 **branches**를 사용할 수 있습니다. Branches는 "작업 중" 코드를 "프로덕션 준비 완료" 코드와 분리할 수 있게 해주며, 여러 사람이 프로젝트에 참여하더라도 서로의 기여와 빈번하게 충돌하지 않도록 하는 추가적인 이점이 있습니다. Branches를 사용하여 실험을 각자의 브랜치에 격리하고, [브랜치를 관리하기 위한 팀 전체의 관행도 채택](https://ericmjl.github.io/essays-on-data-science/workflow/gitflow/)할 수 있습니다.

Git 브랜치에 대해 배우려면 [Learn Git Branching 인터랙티브 튜토리얼](https://learngitbranching.js.org/)을 시도해 볼 수 있습니다.

## 태그 사용

Git을 사용하면 커밋에 *태그*를 붙여 프로젝트의 마일스톤을 쉽게 기록할 수 있습니다. 따라서 Hub 저장소의 커밋에 태그를 붙여 마크할 수 있습니다. 태그 사용법에 대해 자세히 알아보려면 [이 DevConnected 게시물](https://devconnected.com/how-to-create-git-tags/)을 방문하세요.

리포지토리 히스토리에서 중요한 커밋을 쉽게 식별할 수 있을 뿐만 아니라, Git 태그를 사용하면 A/B 테스트를 수행하고 [특정 태그에서 리포지토리를 클론](https://www.techiedelight.com/clone-specific-tag-with-git/)하는 등의 작업도 가능합니다. `huggingface_hub` 라이브러리도 태그를 활용한 작업을 지원하며, 예를 들어 [특정 태그가 지정된 커밋에서 파일을 다운로드](https://huggingface.co/docs/huggingface_hub/main/en/how-to-downstream#hfhuburl)하는 작업이 가능합니다.

## 리포지토리 복제하는 방법

Git 히스토리를 보존해야 하는지에 따라 저장소를 복제하는 방법은 여러 가지가 있습니다.

### Hub에서 복제

어떤 리포지토리 페이지의 오른쪽 상단에 있는 세 점을 클릭한 다음 **이 모델 복제**, **이 데이터셋 복제**, 또는 **이 Space 복제**를 선택합니다. [Xet 중복 제거 기술](./xet/deduplication)을 사용하기 때문에 이 작업은 거의 즉시 완료됩니다. 다음을 선택할 수 있습니다:

* **Owner**: 작성 권한이 있는 계정 또는 조직.
* **저장소 이름**: 복제된 저장소의 이름입니다. 기본적으로 소스와 동일한 이름을 사용하며, 사용자의 네임스페이스 아래에 생성됩니다(예: `bigscience/bloom-560m`을 복제하면 `your-username/bloom-560m`이 생성됩니다).
* **공개 범위**: 복제된 저장소를 공개 또는 비공개로 설정할 수 있습니다. 비공개 저장소에 대한 자세한 내용은 [여기](./repositories-settings#private-repositories)에서 확인하세요.

모델과 데이터셋의 경우 Git 히스토리가 단일 커밋으로 압축됩니다. Spaces의 경우 전체 Git 히스토리가 보존됩니다. Spaces의 경우 공개 변수는 복사되지만, 시크릿은 수동으로 다시 입력해야 합니다.

#### 제한 사항

일부 저장소는 복제할 수 없습니다:
- **게이트된 저장소**(액세스 요청이 활성화된 모델 또는 데이터셋).
- 저자가 **중복을 비활성화**한 저장소.
- **크로스 리전 복제**는 지원되지 않습니다(예: US 리전에 저장된 저장소는 EU 조직으로 복제할 수 없음).

### 프로그램을 통한 복제

`huggingface_hub` 라이브러리 또는 CLI를 사용하여 저장소를 복제할 수도 있습니다. 이 방법들은 위의 Hub 버튼과 동일한 서버 측 API를 사용합니다(모델과 데이터셋의 경우 Git 히스토리가 압축되고, Spaces의 경우 유지됩니다).

Python 사용:

```python
from huggingface_hub import duplicate_repo

duplicate_repo("bigscience/bloom-560m", private=False)
duplicate_repo("openai/gdpval", repo_type="dataset")
duplicate_repo("multimodalart/dreambooth-training", repo_type="space", private=False)
```

또는 CLI를 사용하여:

```bash
hf repos duplicate bigscience/bloom-560m
hf repos duplicate openai/gdpval --type dataset
```

Spaces의 경우 하드웨어, 수면 시간, 저장소, 변수 및 시크릿 등 자체 설정을 구성해야 합니다. 자세한 내용은 [Space 관리](https://huggingface.co/docs/huggingface_hub/guides/manage-spaces) 가이드를 참고하세요.

대신, 저장소의 로컬 복사본을 유지하려면 `hf download`를 실행한 후 다른 네임스페이스로 `hf upload`할 수 있습니다. 이 경우에도 Git 히스토리가 보존되지 않습니다.

### Git으로 수동 포크

모델/데이터셋의 Git 히스토리를 보존하거나 프로세스에 대한 더 많은 제어(예: 자체 변경 사항 위에 rebasing)가 필요하면, Git을 사용하여 저장소를 수동으로 fork할 수 있습니다.

[`git-xet`](https://huggingface.co/docs/hub/xet/using-xet-storage#git)이 설치되어 있어야 합니다. 모든 LFS 파일을 가져와서 다시 업로드해야 하므로 대역폭에 따라 포크하는 데 시간이 걸릴 수 있습니다(다만 Xet 덕분에 다시 업로드는 빠르게 진행됩니다).

1. https://huggingface.co에서 대상 저장소(예: `me/myfork`)를 만듭니다

2. 이를 클론하고 소스 저장소를 원격으로 추가합니다:

```bash
git clone git@hf.co:me/myfork
cd myfork
git xet install
git remote add upstream git@hf.co:friend/upstream
git fetch upstream
git lfs fetch --all upstream
```

3. 포크의 내용을 업스트림 히스토리로 교체합니다:

```bash
git reset --hard upstream/main
```

4. Push:

```bash
git push --force origin main
```

