- shallow clone ๋ ์ ์ฅ์์ ์ ์ฒด ์ปค๋ฐ ํ์คํ ๋ฆฌ๋ฅผ ๋ณต์ํ๋ git ๋ช ๋ น์ด.
- CI/CD ํ๊ฒฝ์์ ๋น๋ ์๋๋ฅผ ์ํด shallow clone์ ์ฌ์ฉํ์ง๋ง, git ํ์คํ ๋ฆฌ๊ฐ ํ์ํ ์์ ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๋ ์ฌ์ฉ
ํด๋น ๊ฐ๋ ์ด ํ์ํ ์ด์
- CI/CD ํ๋ซํผ(Cloudflare Pages, GitHub Actions, Vercel ๋ฑ)์ ๋น๋ ์๋ ์ต์ ํ๋ฅผ ์ํด ๊ธฐ๋ณธ์ ์ผ๋ก
git clone --depth 1(shallow clone)์ ์ํ - shallow clone ์ํ์์๋
git log,git blame, ํ๊ทธ ๊ธฐ๋ฐ ๋ฒ์ ๊ณ์ฐ ๋ฑ ํ์คํ ๋ฆฌ ์์กด ์์ ์ด ์คํจํ๊ฑฐ๋ ๋ถ์ ํํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ git fetch --unshallow๋ก ์ ์ฒด ํ์คํ ๋ฆฌ๋ฅผ ๋ณต์ํ๋ฉด ์ด๋ฌํ ์ ์ฝ์ ํด๊ฒฐํ ์ ์์
AS-IS: Shallow Clone
sequenceDiagram autonumber participant CI as CI/CD ํ๋ซํผ participant Git as Git Remote CI->>Git: git clone --depth 1 Note over CI: ์ปค๋ฐ 1๊ฐ๋ง ์กด์ฌ<br/>ํ์คํ ๋ฆฌ ์กฐํ ๋ถ๊ฐ CI->>CI: git log โ ์ต์ ์ปค๋ฐ 1๊ฐ๋ง ๋ฐํ CI->>CI: git log --diff-filter=A โ ๋ถ์ ํ CI->>CI: git describe --tags โ ์คํจ
TO-BE: unshallow๋ก ๋ณต์
sequenceDiagram autonumber participant CI as CI/CD ํ๋ซํผ participant Git as Git Remote CI->>Git: git clone --depth 1 CI->>Git: git fetch --unshallow Note over CI: ์ ์ฒด ์ปค๋ฐ ํ์คํ ๋ฆฌ ๋ณต์ CI->>CI: git log โ ์ ์ฒด ํ์คํ ๋ฆฌ ์กฐํ ๊ฐ๋ฅ CI->>CI: git log --diff-filter=A โ ์ ํํ ์ต์ด ์ปค๋ฐ CI->>CI: git describe --tags โ ์ ์ ๋์
Shallow Clone์ด๋
git ํ์คํ ๋ฆฌ์ ์ผ๋ถ๋ง ๊ฐ์ ธ์ค๋ clone ๋ฐฉ์์ด๋ค.
git clone --depth 1 # ์ต์ ์ปค๋ฐ 1๊ฐ๋ง
git clone --depth 5 # ์ต์ ์ปค๋ฐ 5๊ฐ๋ง
git clone # ์ ์ฒด ํ์คํ ๋ฆฌ (full clone)์ฅ์ : clone ์๋๊ฐ ๋น ๋ฅด๊ณ ๋์คํฌ ์ฌ์ฉ๋์ด ์ ์ ๋จ์ : ํ์คํ ๋ฆฌ ์์กด ์์ ์ด ๋ถ๊ฐ๋ฅํ๊ฑฐ๋ ๋ถ์ ํ
shallow clone์์ ์คํจํ๋ ์์ ๋ค
| ์์ | ๋ช ๋ น์ด | ์คํจ ์์ธ |
|---|---|---|
| ํ์ผ ์ต์ด ์์ฑ์ผ ์กฐํ | git log --diff-filter=A | ํ์คํ ๋ฆฌ๊ฐ ์์ด ์ต์ด ์ปค๋ฐ์ ์ฐพ์ ์ ์์ |
| ์ฝ๋ blame | git blame | ์์ฑ์/์์ ์ถ์ ๋ถ๊ฐ |
| ํ๊ทธ ๊ธฐ๋ฐ ๋ฒ์ | git describe --tags | ํ๊ทธ๊ฐ shallow ๋ฒ์ ๋ฐ์ด๋ฉด ์คํจ |
| ์ปค๋ฐ ์ ๊ณ์ฐ | git rev-list --count | ๋ถ์ ํํ ๊ฒฐ๊ณผ |
git fetch โunshallow ๋์ ์๋ฆฌ
git fetch --unshallow- shallow clone ์ํ์์๋ง ๋์ (์ด๋ฏธ full clone์ด๋ฉด ์๋ฌ)
- remote์์ ๋๋จธ์ง ๋ชจ๋ ์ปค๋ฐ ํ์คํ ๋ฆฌ๋ฅผ ์ถ๊ฐ๋ก fetch
- ์คํ ํ
.git/shallowํ์ผ์ด ์ ๊ฑฐ๋๋ฉฐ full clone๊ณผ ๋์ผํ ์ํ๊ฐ ๋จ
๊ด๋ จ ๋ช ๋ น์ด ๋น๊ต:
| ๋ช ๋ น์ด | ์ฉ๋ |
|---|---|
git clone --depth 1 | ์ต์ ์ปค๋ฐ 1๊ฐ๋ง clone |
git fetch --unshallow | shallow โ full clone์ผ๋ก ํ์ฅ |
git fetch --depth N | shallow ๊น์ด๋ฅผ N์ผ๋ก ์กฐ์ |
์ค์ ์ฌ๋ก: Quartz ๋ ์ง๋ณ ๋ณด๊ธฐ
๋ฐฐ๊ฒฝ
Quartz ์ ์ ์ฌ์ดํธ์ โ๋ ์ง๋ณ ๋ณด๊ธฐ(DateIndex)โ์์ ํ์ผ์ ์์ฑ ๋ ์ง ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํํ๋ ค๊ณ ํ๋ค.
Quartz ๊ธฐ๋ณธ ์ ๊ณต ํ๋ฌ๊ทธ์ธ CreatedModifiedDate(lastmod.ts)๊ฐ ํ์ผ์ ๋ ์ง๋ฅผ ๊ฒฐ์ ํ๋ค:
// quartz.config.ts
Plugin.CreatedModifiedDate({
priority: ["frontmatter", "git", "filesystem"],
})| ์ฐ์ ์์ | ์์ค | created | modified |
|---|---|---|---|
| 1 | frontmatter | created ํ๋ | modified ํ๋ |
| 2 | git | ์ต์ด ์ปค๋ฐ ๋ ์ง | ์ต๊ทผ ์ปค๋ฐ ๋ ์ง |
| 3 | filesystem | birthtimeMs | mtimeMs |
๋ฌธ์ 1: ํ๋ฌ๊ทธ์ธ์ด git์์ created๋ฅผ ๊ฐ์ ธ์ค์ง ์์
์๋ CreatedModifiedDate ํ๋ฌ๊ทธ์ธ์ git์์ modified๋ง ๊ฐ์ ธ์๋ค:
// ์๋ณธ - git์์ modified๋ง ์กฐํ
modified ||= await repo.getFileLatestModifiedDateAsync(relativePath)
// created๋ ์กฐํํ์ง ์์Obsidian์์ ์์ฑํ ํ์ผ ์ค frontmatter์ created๊ฐ ์๋ ํ์ผ์ด ์กด์ฌํ์ฌ, git โ filesystem์ผ๋ก fallback๋์๋ค.
์์ : git log --diff-filter=A๋ก ์ต์ด ์ปค๋ฐ ๋ ์ง๋ฅผ created๋ก ์ค์ ํ๋ ๋ก์ง ์ถ๊ฐ:
// ์์ - git์์ created๋ ์กฐํ
modified ||= await repo.getFileLatestModifiedDateAsync(relativePath)
if (!created) {
const result = execSync(
`git log --follow --diff-filter=A --format=%at -- "${relativePath}"`,
{ cwd: repositoryWorkdir, encoding: "utf-8" },
).trim()
if (result) {
created = parseInt(result) * 1000
}
}--follow: ํ์ผ๋ช ๋ณ๊ฒฝ ์ถ์ --diff-filter=A: โAddedโ ์ปค๋ฐ๋ง ํํฐ๋ง--format=%at: Unix timestamp ์ถ๋ ฅ- ๋น๋ ํ์์ ์ ์ ๊ณ์ฐ โ ๋ฐํ์ ์ฑ๋ฅ ์ํฅ ์์
๋ฌธ์ 2: Cloudflare Pages shallow clone
์ฝ๋๋ฅผ ์์ ํด๋ Cloudflare Pages ๋น๋ ํ๊ฒฝ์์ 44๊ฐ ํ์ผ์ด ๊ฐ์ ๋ ์ง๋ก ํ์๋์๋ค.
์์ธ: Cloudflare Pages๊ฐ --depth 1 shallow clone์ ์ฌ์ฉํ์ฌ:
1. frontmatter.created โ ์๋ ํ์ผ ์กด์ฌ (undefined)
2. git log --diff-filter=A โ ์ปค๋ฐ 1๊ฐ๋ฟ์ด๋ผ ๋ถ์ ํ
3. filesystem birthtimeMs โ clone ์์ = ๋ชจ๋ ํ์ผ ๋์ผ ๋ ์ง
ํด๊ฒฐ: ๋น๋ ๋ช
๋ น์ด์ git fetch --unshallow ์ถ๊ฐ:
# ๋ณ๊ฒฝ ์
npm ci && npx quartz build
# ๋ณ๊ฒฝ ํ
git fetch --unshallow && npm ci && npx quartz build
์ค์ ์์น: Cloudflare Dashboard โ Workers & Pages โ ํ๋ก์ ํธ โ Settings โ Build command