Skip to content

Latest commit

ย 

History

29 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

RepoManager

์ˆ˜์—…ยท์‹ค์Šต ํ›„ ๋‚จ๋Š” GitHub ์ €์žฅ์†Œ๋ฅผ GUI์—์„œ ๊ณจ๋ผ ๋ฐฑ์—…ยท์•„์นด์ด๋ธŒยท์ด๋ฆ„ ๋ณ€๊ฒฝยท์‚ญ์ œํ•˜๋Š” ๋ฐ์Šคํฌํ†ฑ ์•ฑ์ž…๋‹ˆ๋‹ค.
Windows, macOS, Linux์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค (PySide6).

Screenshot

ํ”„๋กœ์ ํŠธ: https://github.com/progh2/repomanager

๋‚ด๋ ค๋ฐ›๊ธฐ

ํ™ˆํŽ˜์ด์ง€: https://progh2.github.io/repomanager/ โ€” ์šด์˜์ฒด์ œ๋ฅผ ์•Œ์•„์„œ ๊ฐ์ง€ํ•ด ๋งž๋Š” ํŒŒ์ผ์„ ๋ฐ”๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง์ ‘ ๊ณ ๋ฅด๋ ค๋ฉด Releases์—์„œ ๋ฐ›์œผ์„ธ์š”. ์••์ถ• ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ ๋ฐ”๋กœ ์‹คํ–‰๋˜๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

ํ”Œ๋žซํผ ํŒŒ์ผ ์‹คํ–‰ ๋ฐฉ๋ฒ•
Windows RepoManager-<๋ฒ„์ „>-windows-x86_64.exe ๋”๋ธ”ํด๋ฆญ
macOS (Apple Silicon) RepoManager-<๋ฒ„์ „>-macos-arm64.dmg ๋”๋ธ”ํด๋ฆญ โ†’ Applications๋กœ ๋Œ์–ด๋†“๊ธฐ
macOS (Intel) RepoManager-<๋ฒ„์ „>-macos-x86_64.dmg ๋”๋ธ”ํด๋ฆญ โ†’ Applications๋กœ ๋Œ์–ด๋†“๊ธฐ
Linux RepoManager-<๋ฒ„์ „>-linux-x86_64 chmod +x ํ›„ ์‹คํ–‰

SHA256SUMS.txt๋กœ ๋ฌด๊ฒฐ์„ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (sha256sum -c SHA256SUMS.txt).

๋ฏธ์„œ๋ช… ๋นŒ๋“œ๋ผ ์ฒซ ์‹คํ–‰ ์‹œ ๊ฒฝ๊ณ ๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค.

  • Windows: SmartScreen โ†’ ์ถ”๊ฐ€ ์ •๋ณด โ†’ ์‹คํ–‰

  • macOS: ์•ฑ์„ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•ด ์ฐจ๋‹จ๋‹นํ•œ ๋’ค, ์‹œ์Šคํ…œ ์„ค์ • โ†’ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ๋ฐ ๋ณด์•ˆ์„ ์—ด๊ณ  ์•„๋ž˜์ชฝ์˜ ํ™•์ธ ์—†์ด ์—ด๊ธฐ๋ฅผ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค. (ํ„ฐ๋ฏธ๋„์ด ํŽธํ•˜๋ฉด xattr -dr com.apple.quarantine /Applications/RepoManager.app)

    macOS 15(Sequoia)๋ถ€ํ„ฐ ์šฐํด๋ฆญ โ†’ ์—ด๊ธฐ ์šฐํšŒ๊ฐ€ ์ œ๊ฑฐ๋˜์–ด ์œ„ ๋ฐฉ๋ฒ•์„ ์จ์•ผ ํ•ฉ๋‹ˆ๋‹ค. macOS 14 ์ดํ•˜์—์„œ๋Š” ์šฐํด๋ฆญ โ†’ ์—ด๊ธฐ โ†’ ์—ด๊ธฐ ๋„ ๋ฉ๋‹ˆ๋‹ค.

  • Linux: chmod +x RepoManager-*-linux-x86_64

์„ค์น˜ ํ›„์—๋Š” ์•ฑ์ด ์Šค์Šค๋กœ ์ƒˆ ๋ฒ„์ „์„ ํ™•์ธํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค (์•„๋ž˜ ์ฐธ์กฐ).

๊ธฐ๋Šฅ

๋ชฉ๋กยทํ•„ํ„ฐ

  • ํ™œ์„ฑ / ์•„์นด์ด๋ธŒ ์ด์ค‘ ๋ชฉ๋ก๊ณผ โ†’ โ† ์ด๋™
  • ๊ฒ€์ƒ‰, Owner, ๊ณต๊ฐœ๋ฒ”์œ„, Pages, Fork, ์ •๋ ฌ(์ด๋ฆ„ / ์—…๋ฐ์ดํŠธ / ์ƒ์„ฑ)
  • ์ƒ์„ฑ์ผยท์—…๋ฐ์ดํŠธ์ผ, Public/Private, ์„ค๋ช…, PagesยทFork ์•„์ด์ฝ˜
  • ๋”๋ธ”ํด๋ฆญ ๋˜๋Š” ๋ฒ„ํŠผ์œผ๋กœ GitHub / Pages ์—ด๊ธฐ
  • ๋กœ๋”ฉ ์Šคํ”ผ๋„ˆ ์˜ค๋ฒ„๋ ˆ์ด, ์‹œ์ž‘ ์‹œ ์บ์‹œ ๋ชฉ๋ก ์ฆ‰์‹œ ํ‘œ์‹œ ํ›„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ƒˆ๋กœ๊ณ ์นจ
  • ์ฐฝ ํฌ๊ธฐยทํ•„ํ„ฐยท์ •๋ ฌ ์ƒํƒœ ๊ธฐ์–ต

ํŽธ์ง‘ยท์ •๋ฆฌ

  • ์„ค๋ช… ํŽธ์ง‘, AI ์ถ”์ฒœ ์„ค๋ช…(GitHub Models / Copilot ๊ถŒํ•œ ์‹œ, UI ์–ธ์–ด๋กœ ์ƒ์„ฑ)
  • ๊ณต๊ฐœ/๋น„๊ณต๊ฐœ ํ† ๊ธ€
  • ์ด๋ฆ„ ๋ณ€๊ฒฝ โ€” URLยทremoteยทPages ๋“ฑ์ด ๊นจ์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒฝ๊ณ  + RENAME ์ž…๋ ฅ ํ™•์ธ
  • ์„ ํƒ ์ €์žฅ์†Œ ์ผ๊ด„ ์•„์นด์ด๋ธŒ / ํ™œ์„ฑ ๋ณต์› / ์‚ญ์ œ
  • ์‚ญ์ œยท์ด๋ฆ„ ๋ณ€๊ฒฝ ์ „ ํ™•์ธ ์ฐฝ (DELETE / RENAME ์ž…๋ ฅ)
  • ์‚ญ์ œ ์ „ CSV ๋‚ด๋ณด๋‚ด๊ธฐ, ZIP ๋ฐฑ์—…

ZIP ๋ฐฑ์—… (์‚ญ์ œ ์ „ ๊ถŒ์žฅ)

  • git clone --mirror๋กœ ๋ชจ๋“  ๋ธŒ๋žœ์น˜ยทํƒœ๊ทธ ํฌํ•จ
  • Issues / Pull requests / Milestones๋ฅผ JSON์œผ๋กœ ํ•จ๊ป˜ ์ €์žฅ
  • ์ƒ์„ธ ํŒจ๋„, ์ƒ๋‹จ ZIP ๋ฐฑ์—…, ์‚ญ์ œ ํ™•์ธ ์ฐฝ์—์„œ ์‹คํ–‰
  • ๋กœ์ปฌ์— Git์ด ์—†์œผ๋ฉด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋งŒ ์ €์žฅํ•˜๊ณ  ์•ˆ๋‚ด

์ธ์ฆยท์„ค์ •ยทUX

  • PAT / GitHub CLI / ์›น ๋กœ๊ทธ์ธ(OAuth Device Flow)
  • ํ† ํฐ์€ OS ์ž๊ฒฉ ์ฆ๋ช… ์ €์žฅ์†Œ(keyring)์— ์ €์žฅ
  • ๋‹ค๊ตญ์–ด UI: ํ•œ๊ตญ์–ด / English / ๆ—ฅๆœฌ่ชž (์‹œ์Šคํ…œ ๊ธฐ๋ณธ)
  • ๋ผ์ดํŠธ / ๋‹คํฌ ํ…Œ๋งˆ
  • ๋‹จ์ถ•ํ‚ค: F5ยทCtrl+R ์ƒˆ๋กœ๊ณ ์นจ, Delete ์‚ญ์ œ ํ™•์ธ, Ctrl+, ์„ค์ •, Ctrl+Q ์ข…๋ฃŒ
  • API rate limit ํ‘œ์‹œ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์›Œ์ปค๋กœ UI ๋ฉˆ์ถค ๋ฐฉ์ง€
  • ์ž๋™ ์—…๋ฐ์ดํŠธ โ€” ์ƒˆ ๋ฆด๋ฆฌ์Šค๋ฅผ ํ™•์ธํ•ด ๋‚ด๋ ค๋ฐ›๊ณ  ์Šค์Šค๋กœ ๊ต์ฒด ํ›„ ์žฌ์‹œ์ž‘

์š”๊ตฌ ์‚ฌํ•ญ

  • ์‹คํ–‰ํŒŒ์ผ๋กœ ์“ธ ๋•Œ๋Š” Python์ด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.
  • ์†Œ์Šค์—์„œ ์‹คํ–‰ํ•  ๋•Œ: Python 3.11+
  • GitHub ๊ณ„์ • (์•ฑ์—์„œ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์œผ๋กœ ์—ฐ๊ฒฐ โ€” ํ† ํฐ์„ ์ง์ ‘ ๋งŒ๋“ค ํ•„์š” ์—†์Œ)
  • gh CLI: ๋ถˆํ•„์š” (์„ค์น˜๋ผ ์žˆ์œผ๋ฉด ํ† ํฐ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ํŽธ์˜ ๊ธฐ๋Šฅ์ผ ๋ฟ)
  • git: ZIP ๋ฐฑ์—…์— ๋ธŒ๋žœ์น˜ยท์ปค๋ฐ‹๊นŒ์ง€ ๋‹ด๊ณ  ์‹ถ์„ ๋•Œ๋งŒ ํ•„์š”. ์—†์œผ๋ฉด ์ด์Šˆยท๋งˆ์ผ์Šคํ†ค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋งŒ ๋ฐฑ์—…ํ•ฉ๋‹ˆ๋‹ค.

์†Œ์Šค์—์„œ ์‹คํ–‰

# Windows โ€” ๋”๋ธ”ํด๋ฆญ ๋˜๋Š” ํ„ฐ๋ฏธ๋„
run.bat

# macOS / Linux
./run.sh

์ฒซ ์‹คํ–‰ ์‹œ .venv ์ƒ์„ฑ๊ณผ ์˜์กด์„ฑ ์„ค์น˜๋ฅผ ์ž๋™์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
์˜์กด์„ฑ๋งŒ ๋‹ค์‹œ ์„ค์น˜: run.bat --update / ./run.sh --update

์ˆ˜๋™ ์„ค์น˜ยท์‹คํ–‰

python -m venv .venv

# Windows
.venv\Scripts\activate

# macOS / Linux
source .venv/bin/activate

pip install -r requirements.txt
# ๋˜๋Š”: pip install -e ".[dev]"

python -m repomanager

์„ ํƒ์ ์œผ๋กœ .env์— ํ† ํฐ์„ ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (copy / cp .env.example .env).

GITHUB_TOKEN=ghp_your_token_here
GITHUB_OAUTH_CLIENT_ID=Iv1...   # ์›น ๋กœ๊ทธ์ธ์šฉ(์„ ํƒ)

GitHub ์ธ์ฆ

1) GitHub์œผ๋กœ ๋กœ๊ทธ์ธ (๊ถŒ์žฅ)

ํŒŒ์ผ โ†’ ์„ค์ • (Ctrl+,) โ†’ GitHub ์›น์œผ๋กœ ๋กœ๊ทธ์ธ

๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์—ด๋ฆฝ๋‹ˆ๋‹ค. ํ™”๋ฉด์— ๋‚˜์˜จ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  Authorize๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋์ž…๋‹ˆ๋‹ค. ํ† ํฐ์„ ์ง์ ‘ ๋งŒ๋“ค ํ•„์š”๋„, gh CLI๋ฅผ ์„ค์น˜ํ•  ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค. ์š”์ฒญ ๊ถŒํ•œ์€ repo, delete_repo, read:org์ž…๋‹ˆ๋‹ค.

์•ฑ์— RepoManager์˜ OAuth App Client ID๊ฐ€ ๋‚ด์žฅ๋ผ ์žˆ์Šต๋‹ˆ๋‹ค. Device Flow์˜ Client ID๋Š” ๊ณต๊ฐœ ์ •๋ณด๋ผ(Client Secret์„ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค) ์†Œ์Šค์— ํฌํ•จํ•ด๋„ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ์ง์ ‘ ๋งŒ๋“  OAuth App์„ ์“ฐ๊ณ  ์‹ถ๋‹ค๋ฉด ์„ค์ •์—์„œ ๋‚ด๊ฐ€ ๋งŒ๋“  OAuth App ์‚ฌ์šฉ์„ ์ฒดํฌํ•˜์„ธ์š”.

2) ํ† ํฐ์„ ์ง์ ‘ ๋„ฃ๊ธฐ

์„ค์ • ์ฐฝ์—์„œ Personal Access Token์„ ๋ถ™์—ฌ๋„ฃ๊ฑฐ๋‚˜, GitHub CLI์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. gh CLI๋Š” ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค โ€” ์„ค์น˜๋ผ ์žˆ์ง€ ์•Š์•„๋„ ์•ฑ์€ ์ •์ƒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

ํ† ํฐ ์šฐ์„ ์ˆœ์œ„: ํ™˜๊ฒฝ๋ณ€์ˆ˜(.env) โ†’ ์„ค์ •์— ์ €์žฅํ•œ ํ† ํฐ โ†’ GitHub CLI(gh).

ํ† ํฐ์€ Windows Credential Manager / macOS Keychain / Linux Secret Service์— keyring์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
keyring์„ ์“ธ ์ˆ˜ ์—†์œผ๋ฉด Qt QSettings๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค.

3) Classic PAT ๊ถŒํ•œ

์ž‘์—… ํ•„์š” ๊ถŒํ•œ
๋ชฉ๋กยท์•„์นด์ด๋ธŒยท์„ค๋ช…ยท์ด๋ฆ„ ๋ณ€๊ฒฝ repo
์‚ญ์ œ delete_repo (๋ณ„๋„)
์กฐ์ง ์ €์žฅ์†Œ read:org (ํ•„์š” ์‹œ)

Fine-grained PAT๋Š” ๋Œ€์ƒ ์ €์žฅ์†Œ์— Administration: Read and write(์‚ญ์ œยท์ด๋ฆ„ ๋ณ€๊ฒฝ ๋“ฑ)๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4) GitHub CLI๋กœ ์‚ญ์ œ ๊ถŒํ•œ

gh auth refresh -h github.com -s delete_repo

์ดํ›„ ์„ค์ •์—์„œ CLI ํ† ํฐ์„ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค์„ธ์š”. ์‚ญ์ œ๊ฐ€ 403์ด๋ฉด ๋„์›€๋ง โ†’ ์‚ญ์ œ ๊ถŒํ•œ ์•ˆ๋‚ด๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

5) ์ง์ ‘ ๋งŒ๋“  OAuth App ์“ฐ๊ธฐ (์„ ํƒ)

๋‚ด์žฅ Client ID ๋Œ€์‹  ์ž๊ธฐ ๊ฒƒ์„ ์“ฐ๋ ค๋ฉด:

  1. https://github.com/settings/developers โ†’ New OAuth App
  2. Callback: http://127.0.0.1, ์ƒ์„ฑ ํ›„ Enable device flow ์ฒดํฌ
  3. ์„ค์ •์—์„œ ๋‚ด๊ฐ€ ๋งŒ๋“  OAuth App ์‚ฌ์šฉ์„ ์ผœ๊ณ  Client ID๋งŒ ์ž…๋ ฅ (Client Secret์€ ๋„ฃ์ง€ ๋งˆ์„ธ์š”)

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

  1. ์•ฑ ์‹คํ–‰ โ†’ ํ† ํฐ์ด ์—†์œผ๋ฉด ์„ค์ • ์•ˆ๋‚ด (์บ์‹œ๊ฐ€ ์žˆ์œผ๋ฉด ๋ชฉ๋ก์ด ๋ฐ”๋กœ ํ‘œ์‹œ๋จ)
  2. ํŒŒ์ผ โ†’ ์„ค์ •์—์„œ ์ธ์ฆยท์–ธ์–ดยทํ…Œ๋งˆ ๊ตฌ์„ฑ
  3. ์ƒˆ๋กœ๊ณ ์นจ (F5)์œผ๋กœ ์ตœ์‹  ๋ชฉ๋ก ๋กœ๋“œ
  4. ํ•„ํ„ฐยท์ •๋ ฌ๋กœ ๋Œ€์ƒ ์ขํžˆ๊ธฐ (์˜ˆ: Fork๋งŒ, Pages ์žˆ์Œ, ์˜ค๋ž˜๋œ ์—…๋ฐ์ดํŠธ์ˆœ)
  5. ์™ผ์ชฝ(ํ™œ์„ฑ) / ์˜ค๋ฅธ์ชฝ(์•„์นด์ด๋ธŒ)์—์„œ ์„ ํƒ โ†’ โ†’ / โ† ๋กœ ์ด๋™
  6. ์•„๋ž˜ ํŒจ๋„์—์„œ ์„ค๋ช…ยท๊ณต๊ฐœ์—ฌ๋ถ€ยท์ด๋ฆ„ ๋ณ€๊ฒฝยทPagesยทZIP ๋ฐฑ์—…
  7. ์‚ญ์ œ ์ „: ZIP ๋ฐฑ์—… ๋˜๋Š” CSV ๋‚ด๋ณด๋‚ด๊ธฐ โ†’ DELETE ์ž…๋ ฅ ํ›„ ์‚ญ์ œ
  8. ์ƒˆ ๋ฒ„์ „์ด ๋‚˜์˜ค๋ฉด ์‹œ์ž‘ ์‹œ ์•Œ๋ฆผ โ€” ๋„์›€๋ง โ†’ ์—…๋ฐ์ดํŠธ ํ™•์ธ์œผ๋กœ ์ง์ ‘ ํ™•์ธ๋„ ๊ฐ€๋Šฅ

ZIP ๋ฐฑ์—… ๊ตฌ์กฐ

owner-repo-backup-YYYYMMDD-HHMMSS.zip
โ”œโ”€โ”€ README.md
โ”œโ”€โ”€ repository.git/          # bare mirror (์ „์ฒด ๋ธŒ๋žœ์น˜ยทํƒœ๊ทธ)
โ”‚   โ””โ”€โ”€ ...
โ””โ”€โ”€ metadata/
    โ”œโ”€โ”€ repository.json
    โ”œโ”€โ”€ issues.json          # issues + PRs
    โ”œโ”€โ”€ milestones.json
    โ””โ”€โ”€ README.md

๋ณต์› ์˜ˆ:

git clone repository.git restored-folder

์ฃผ์˜

  • ์‚ญ์ œ๋Š” ๋˜๋Œ๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์‚ญ์ œ ์ „์— ZIP ๋ฐฑ์—…์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฆ„ ๋ณ€๊ฒฝ ์‹œ GitHub URL, git remote, Pages, ๋ถ๋งˆํฌ, ๋‹ค๋ฅธ ์ €์žฅ์†Œ์˜ ์ฐธ์กฐ๊ฐ€ ๊นจ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์•„์นด์ด๋ธŒ๋Š” ์ฝ๊ธฐ ์ „์šฉ์ด๋ฉฐ ๋‚˜์ค‘์— ํ™œ์„ฑ์œผ๋กœ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•ด ๋ฐœ์ƒํ•œ ๊ฒฐ๊ณผ๋Š” ์‚ฌ์šฉ์ž ์ฑ…์ž„์ž…๋‹ˆ๋‹ค. (์•ฑ ๋„์›€๋ง โ†’ ์ •๋ณด)

์ž๋™ ์—…๋ฐ์ดํŠธ

์‹คํ–‰ํŒŒ์ผ๋กœ ์„ค์น˜ํ•œ ๊ฒฝ์šฐ ์•ฑ์ด ์Šค์Šค๋กœ ์ตœ์‹  ๋ฆด๋ฆฌ์Šค๋กœ ๊ฐˆ์•„ํƒ‘๋‹ˆ๋‹ค.

  • ์ž๋™ ํ™•์ธ โ€” ์‹œ์ž‘ ํ›„ ์ž ์‹œ ๋’ค, ํ•˜๋ฃจ์— ํ•œ ๋ฒˆ GitHub Releases๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์ˆ˜๋™ ํ™•์ธ โ€” ๋„์›€๋ง โ†’ ์—…๋ฐ์ดํŠธ ํ™•์ธ
  • ๋„๊ธฐ โ€” ๋„์›€๋ง โ†’ ์‹œ์ž‘ํ•  ๋•Œ ์ž๋™์œผ๋กœ ํ™•์ธ ์ฒดํฌ ํ•ด์ œ
  • ์—…๋ฐ์ดํŠธ ์ฐฝ์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ™•์ธํ•˜๊ณ  ๋‹ค์šด๋กœ๋“œ ํ›„ ์„ค์น˜๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋‚ด๋ ค๋ฐ›๊ธฐ โ†’ SHA256SUMS.txt ๊ฒ€์ฆ โ†’ ์•ฑ ์ข…๋ฃŒ โ†’ ๊ต์ฒด โ†’ ์ž๋™ ์žฌ์‹œ์ž‘ ์ˆœ์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ํŠน์ • ๋ฒ„์ „์„ ๋„˜๊ธฐ๋ ค๋ฉด ์ด ๋ฒ„์ „ ๊ฑด๋„ˆ๋›ฐ๊ธฐ๋ฅผ ๋ˆ„๋ฅด์„ธ์š” (์ž๋™ ํ™•์ธ์—์„œ๋งŒ ๋ฌด์‹œ).

ํ”Œ๋žซํผ๋ณ„ ๊ต์ฒด ๋ฐฉ์‹:

ํ”Œ๋žซํผ ๊ต์ฒด ๋Œ€์ƒ
Windows ์‹คํ–‰ ์ค‘์ด๋˜ .exe๋ฅผ ์ƒˆ ํŒŒ์ผ๋กœ ๋ฎ์–ด์”€
macOS .dmg๋ฅผ ๋งˆ์šดํŠธํ•ด RepoManager.app ๋ฒˆ๋“ค์„ ๊ต์ฒดํ•˜๊ณ  quarantine ์†์„ฑ ์ œ๊ฑฐ
Linux ์‹คํ–‰ ํŒŒ์ผ์„ ๊ฐ™์€ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋ฐ›์•„ ์›์ž์ ์œผ๋กœ ๊ต์ฒด

์†Œ์Šค์—์„œ ์‹คํ–‰ ์ค‘์ด๊ฑฐ๋‚˜ ์„ค์น˜ ์œ„์น˜์— ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ์—†์œผ๋ฉด ์„ค์น˜ ๋ฒ„ํŠผ ๋Œ€์‹  ๋ฆด๋ฆฌ์Šค ํŽ˜์ด์ง€ ๋งํฌ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. (git pull๋กœ ์—…๋ฐ์ดํŠธํ•˜์„ธ์š”.)

๋ฐฐํฌยท๋ฆด๋ฆฌ์Šค

ํ”Œ๋žซํผ๋ณ„ ์‹คํ–‰ํŒŒ์ผ์€ GitHub Actions์—์„œ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ์ž…๋‹ˆ๋‹ค. ํฌ๋กœ์Šค ์ปดํŒŒ์ผ์ด ์•ˆ ๋˜๋ฏ€๋กœ ๋กœ์ปฌ ๋นŒ๋“œ๋Š” ํ•ด๋‹น OS์—์„œ๋งŒ, ํ™•์ธ์šฉ์œผ๋กœ ์”๋‹ˆ๋‹ค.

1) GitHub Actions (๊ถŒ์žฅ)

๋กœ์ปฌ์— WindowsยทmacOSยทLinux๋ฅผ ๋‹ค ๊ฐ–์ถœ ํ•„์š” ์—†์ด .github/workflows/release.yml์ด 4๊ฐœ ํ”Œ๋žซํผ์„ GitHub ๋Ÿฌ๋„ˆ์—์„œ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค (ubuntu-22.04, windows-latest, macos-15, macos-15-intel). Linux๋Š” glibc ํ˜ธํ™˜ ๋ฒ”์œ„๋ฅผ ๋„“ํžˆ๋ ค๊ณ  ์ผ๋ถ€๋Ÿฌ ์˜ค๋ž˜๋œ ์ด๋ฏธ์ง€๋ฅผ ์”๋‹ˆ๋‹ค. ์ž๋™ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ด ๋ฆด๋ฆฌ์Šค๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.

์ตœ์ดˆ 1ํšŒ ์ €์žฅ์†Œ ์„ค์ •

์ด ์ €์žฅ์†Œ๋Š” Actions ์‹คํ–‰ ๋ฒ”์œ„๊ฐ€ local_only(์ €์žฅ์†Œ ์ž์ฒด ์•ก์…˜๋งŒ ํ—ˆ์šฉ)๋กœ ์ œํ•œ๋ผ ์žˆ์–ด, ๊ทธ๋Œ€๋กœ ๋‘๋ฉด actions/checkout์กฐ์ฐจ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค. Settings โ†’ Actions โ†’ General โ†’ Actions permissions์—์„œ

Allow progh2, and select non-progh2, actions and reusable workflows โ†’ โ˜‘ Allow actions created by GitHub

๋ฅผ ์ผœ์ฃผ์„ธ์š”. ์›Œํฌํ”Œ๋กœ๊ฐ€ ์“ฐ๋Š” ์•ก์…˜์€ ์ „๋ถ€ GitHub ๊ณต์‹(actions/*)์ด๋ผ ์ด๊ฒƒ๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋“œํŒŒํ‹ฐ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค ์•ก์…˜์€ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค (๋ฆด๋ฆฌ์Šค ๋ฐœํ–‰๋„ ๋Ÿฌ๋„ˆ์— ๊ธฐ๋ณธ ์„ค์น˜๋œ gh CLI๋กœ ํ•ฉ๋‹ˆ๋‹ค).

ํ™ˆํŽ˜์ด์ง€๋ฅผ ์“ฐ๋ ค๋ฉด Settings โ†’ Pages โ†’ Source: GitHub Actions๋„ ํ•œ ๋ฒˆ ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Actions ํƒญ์—์„œ ์‹คํ–‰ โ€” ๋กœ์ปฌ ์ž‘์—… ์—†์Œ

  1. ๋จผ์ € src/repomanager/__init__.py์˜ __version__๊ณผ pyproject.toml์˜ version์„ ์˜ฌ๋ ค pushํ•ฉ๋‹ˆ๋‹ค.

  2. GitHub โ†’ Actions โ†’ Release โ†’ Run workflow

  3. ์˜ต์…˜์„ ๊ณ ๋ฅด๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    ์ž…๋ ฅ ๋œป
    publish ์ฒดํฌํ•˜๋ฉด Release๊นŒ์ง€ ์ƒ์„ฑ. ํ•ด์ œํ•˜๋ฉด ๋นŒ๋“œ ์•„ํ‹ฐํŒฉํŠธ๋งŒ
    tag ๋น„์›Œ๋‘๋ฉด v<__version__> ์‚ฌ์šฉ
    draft ์ดˆ์•ˆ์œผ๋กœ ๋งŒ๋“ค๊ธฐ
    prerelease ํ”„๋ฆฌ๋ฆด๋ฆฌ์Šค๋กœ ํ‘œ์‹œ

    publish๋ฅผ ์ฒดํฌํ•˜๋ฉด ํƒœ๊ทธ๋ฅผ ๋กœ์ปฌ์—์„œ ๋งŒ๋“ค ํ•„์š” ์—†์ด ํ•ด๋‹น ์ปค๋ฐ‹์— ํƒœ๊ทธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  Release๊ฐ€ ์˜ฌ๋ผ๊ฐ‘๋‹ˆ๋‹ค. ์ฒดํฌํ•˜์ง€ ์•Š์œผ๋ฉด 4์ข… ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์•„ํ‹ฐํŒฉํŠธ๋กœ๋งŒ ๋ฐ›์•„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(14์ผ ๋ณด๊ด€).

ํƒœ๊ทธ push

git tag v0.4.1
git push origin v0.4.1     # ๋นŒ๋“œ + ๋ฐฐํฌ๊ฐ€ ์ž๋™ ์‹คํ–‰

์–ด๋А ์ชฝ์ด๋“  ํƒœ๊ทธ๊ฐ€ __version__๊ณผ ๋‹ค๋ฅด๋ฉด ๋ฐฐํฌ๋ฅผ ์ค‘๋‹จํ•˜๊ณ , 4๊ฐœ ํ”Œ๋žซํผ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋น ์ง€๋ฉด ๋ถ€๋ถ„ ๋ฆด๋ฆฌ์Šค๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ธ ํ”Œ๋žซํผ ๋ชจ๋‘ ์—…๋กœ๋“œ ์ „์— --selftest๋กœ ์‹ค์ œ ๊ธฐ๋™์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค (UI๋ฅผ ์ „๋ถ€ ๋งŒ๋“ค๊ณ  ์ข…๋ฃŒ ์ฝ”๋“œ๋กœ ์„ฑ๊ณต/์‹คํŒจ๋ฅผ ์•Œ๋ฆฝ๋‹ˆ๋‹ค).

์—์…‹ ์ด๋ฆ„์€ RepoManager-<๋ฒ„์ „>-<ํ”Œ๋žซํผ>-<์•„ํ‚คํ…์ฒ˜> ํ˜•์‹์„ ์ง€์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—…๋ฐ์ดํ„ฐ๊ฐ€ ์ด ์ด๋ฆ„์œผ๋กœ ์ž๊ธฐ ํ”Œ๋žซํผ์šฉ ํŒŒ์ผ์„ ๊ณ ๋ฆ…๋‹ˆ๋‹ค.

2) ๋กœ์ปฌ ๋นŒ๋“œ

pip install -r requirements.txt
pip install "pyinstaller>=6.6" "pillow>=10.0"   # ๋˜๋Š”: pip install -e ".[build]"

python packaging/build.py

๊ฒฐ๊ณผ๋ฌผ์€ dist/release/์— ์ƒ๊น๋‹ˆ๋‹ค.

dist/release/
โ”œโ”€โ”€ RepoManager-0.4.1-linux-x86_64      # ๋˜๋Š” -windows-x86_64.exe / -macos-arm64.dmg
โ””โ”€โ”€ SHA256SUMS.txt
  • packaging/repomanager.spec โ€” PyInstaller ์„ค์ • (์•„์ด์ฝ˜, ๋ฐ์ดํ„ฐ ํŒŒ์ผ, Qt ๋ชจ๋“ˆ ์ œ์™ธ)
  • packaging/build.py โ€” ์•„์ด์ฝ˜ ์ƒ์„ฑ โ†’ PyInstaller ์‹คํ–‰ โ†’ ์ด๋ฆ„ ์ •๋ฆฌ โ†’ ์ฒดํฌ์„ฌ
  • packaging/make_icons.py โ€” icon.png โ†’ .ico / .icns

์ฃผ์˜

  • ํ† ํฐ์„ ๋ฐ”์ด๋„ˆ๋ฆฌ์— ๋„ฃ์ง€ ๋งˆ์„ธ์š”.
  • ๋นŒ๋“œ๋Š” ์„œ๋ช…๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Windows SmartScreen / macOS Gatekeeper ๊ฒฝ๊ณ ๋Š” ์œ„ ๋‚ด๋ ค๋ฐ›๊ธฐ ์ ˆ์˜ ์•ˆ๋‚ด๋Œ€๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฆด๋ฆฌ์Šค๋ฅผ ์ƒˆ๋กœ ์˜ฌ๋ฆฌ๋ฉด ๊ธฐ์กด ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ํ•˜๋ฃจ ์•ˆ์— ์—…๋ฐ์ดํŠธ ์•Œ๋ฆผ์ด ๋œน๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ

pip install -r requirements.txt
pytest

ํ—ค๋“œ๋ฆฌ์Šค ํ™˜๊ฒฝ(์„œ๋ฒ„ยท์ปจํ…Œ์ด๋„ˆ)์—์„œ๋Š” Qt ํ”Œ๋žซํผ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์˜คํ”„์Šคํฌ๋ฆฐ์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

QT_QPA_PLATFORM=offscreen pytest

.github/workflows/ci.yml์ด pushยทPR๋งˆ๋‹ค Linux / Windows / macOS์—์„œ ๊ฐ™์€ ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ฆฝ๋‹ˆ๋‹ค.

ํ™ˆํŽ˜์ด์ง€

docs/๊ฐ€ ๊ณง ํ™ˆํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค (https://progh2.github.io/repomanager/). ๋นŒ๋“œ ๋„๊ตฌ ์—†๋Š” ์ •์  HTML/CSS/JS๋ผ ํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ ์—ด์–ด์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

python -m http.server -d docs 8000    # http://localhost:8000
  • download.js๊ฐ€ GitHub Releases API๋กœ ์ตœ์‹  ์ž์‚ฐ์„ ์ฐพ์•„ ๋ฐฉ๋ฌธ์ž OS์— ๋งž๋Š” ๋‹ค์šด๋กœ๋“œ ๋ฒ„ํŠผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. API ํ˜ธ์ถœ์ด ์‹คํŒจํ•˜๋ฉด Releases ํŽ˜์ด์ง€ ๋งํฌ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค.
  • ๋ฆด๋ฆฌ์Šค ์ž์‚ฐ ์ด๋ฆ„ ๊ทœ์น™(RepoManager-<๋ฒ„์ „>-<ํ”Œ๋žซํผ>-<์•„ํ‚คํ…์ฒ˜>)์— ์˜์กดํ•˜๋ฏ€๋กœ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋ฉด docs/download.js์˜ TARGETS๋„ ํ•จ๊ป˜ ๊ณ ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • docs/**๊ฐ€ ๋ฐ”๋€Œ๋ฉด .github/workflows/pages.yml์ด ์ž๋™ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ดˆ 1ํšŒ๋งŒ ์ €์žฅ์†Œ Settings โ†’ Pages โ†’ Source: GitHub Actions ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค (Actions ์‹คํ–‰ ํ—ˆ์šฉ ๋ฒ”์œ„๋„ ํ•จ๊ป˜ ์—ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค โ€” ์œ„ ์ตœ์ดˆ 1ํšŒ ์ €์žฅ์†Œ ์„ค์ • ์ฐธ๊ณ ).
  • ๋งˆ์Šค์ฝ”ํŠธ(mascot.svg)๋Š” ์ง์ ‘ ๊ทธ๋ฆฐ ์˜ค๋ฆฌ์ง€๋„ ์บ๋ฆญํ„ฐ์ž…๋‹ˆ๋‹ค. GitHub์˜ Octocat ์ด๋ฏธ์ง€๋Š” ์ƒํ‘œ๋ผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œยทํŠธ๋ž˜ํ‚น

  • PRD.md โ€” ์ œํ’ˆ ์š”๊ตฌ์‚ฌํ•ญยท๋ฒ”์œ„ยท๋งˆ์ผ์Šคํ†ค
  • GitHub Milestones / Issues โ€” ๋‹จ๊ณ„๋ณ„ ๊ณผ์—… (M1โ€“M9)

๊ฐœ๋ฐœ ๊ตฌ์กฐ

src/repomanager/
  __main__.py               # python -m repomanager
  app.py                    # QApplication ๋ถ€ํŠธ์ŠคํŠธ๋žฉ
  config.py                 # ํ† ํฐ / keyring / QSettings / ์—…๋ฐ์ดํŠธ ์„ค์ •
  i18n.py                   # ko / en / ja
  models/repository.py
  services/
    github_client.py        # PyGithub ๋ž˜ํผ, rate limit
    repo_backup.py          # ZIP mirror + issues/milestones
    repo_cache.py           # ์‹œ์ž‘ ์‹œ ์ฆ‰์‹œ ํ‘œ์‹œ์šฉ ๋ชฉ๋ก ์บ์‹œ
    oauth_device.py         # OAuth Device Flow
    ai_assist.py            # GitHub Models ์„ค๋ช… ์ถ”์ฒœ
    updater.py              # ๋ฆด๋ฆฌ์Šค ํ™•์ธ / ๋‹ค์šด๋กœ๋“œ / ์ž๊ธฐ ๊ต์ฒด
  workers/                  # QRunnable โ€” UI ์Šค๋ ˆ๋“œ ๋ฐ–์—์„œ ์‹คํ–‰
    api_worker.py
    update_worker.py
  ui/
    main_window.py          # ๋ฉ”๋‰ดยทํˆด๋ฐ”ยท์ƒํƒœ๋ฐ”, ์›Œ์ปค ๋ฐฐ์„ 
    dual_repo_lists.py      # ํ™œ์„ฑ/์•„์นด์ด๋ธŒ ์ด์ค‘ ๋ชฉ๋ก, ํ•„ํ„ฐยท์ •๋ ฌ
    repo_item_delegate.py   # ๋ฆฌ์ŠคํŠธ ์•„์ดํ…œ ์ปค์Šคํ…€ ๊ทธ๋ฆฌ๊ธฐ
    repo_detail_panel.py    # ์„ค๋ช…ยท๊ณต๊ฐœ์—ฌ๋ถ€ยท์ด๋ฆ„ ๋ณ€๊ฒฝยท๋ฐฑ์—…
    confirm_dialog.py       # DELETE ์ž…๋ ฅ, CSV ๋‚ด๋ณด๋‚ด๊ธฐ
    rename_dialog.py        # RENAME ์ž…๋ ฅ
    settings_dialog.py      # ํ† ํฐยท์–ธ์–ดยทํ…Œ๋งˆ
    update_dialog.py        # ๋ณ€๊ฒฝ ์‚ฌํ•ญยท๋‹ค์šด๋กœ๋“œยท์„ค์น˜
    about_dialog.py
    loading_overlay.py
    theme.py                # ๋ผ์ดํŠธ/๋‹คํฌ ์„ ํƒ
    styles.qss / styles_dark.qss
    assets/icon.png         # .ico / .icns ์˜ ์›๋ณธ

packaging/
  build.py                  # ์•„์ด์ฝ˜ โ†’ PyInstaller โ†’ ์ด๋ฆ„ ์ •๋ฆฌ โ†’ ์ฒดํฌ์„ฌ
  repomanager.spec          # PyInstaller ์„ค์ •
  make_icons.py             # icon.png โ†’ .ico / .icns
docs/                       # ํ™ˆํŽ˜์ด์ง€ (GitHub Pages)
  index.html
  style.css
  download.js               # OS ๊ฐ์ง€ + ์ตœ์‹  ๋ฆด๋ฆฌ์Šค ์ž์‚ฐ ๋งํฌ
  mascot.svg
.github/workflows/
  ci.yml                    # 3๊ฐœ OS ํ…Œ์ŠคํŠธ
  release.yml               # 4๊ฐœ ํ”Œ๋žซํผ ๋นŒ๋“œยท๋ฐฐํฌ
  pages.yml                 # docs/ ๋ฅผ GitHub Pages ๋กœ ๋ฐฐํฌ
tests/                      # pytest โ€” ์„œ๋น„์Šคยท์›Œ์ปคยท๋‹ค์ด์–ผ๋กœ๊ทธ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ

๋ผ์ด์„ ์Šค

MIT โ€” LICENSE

About

Desktop GUI to list, archive, and delete GitHub repositories in bulk (PySide6)

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages