An open API service indexing awesome lists of open source software.

https://github.com/anthais/glsync

Two-way sync between GitLab and local Markdown files. Manage issues, milestones, and labels as code.
https://github.com/anthais/glsync

cli devops gitlab issues-as-code markdown nodejs project-management sync typescript

Last synced: about 1 month ago
JSON representation

Two-way sync between GitLab and local Markdown files. Manage issues, milestones, and labels as code.

Awesome Lists containing this project

README

          

# glsync

Two-way sync between GitLab and local Markdown files. Manage issues, milestones, and labels as code — version-controlled, diffable, and editable in your favorite editor.

## Features

- **Two-way sync** — pull from GitLab, edit locally, push back
- **Hash-based conflict detection** — never accidentally overwrite someone else's changes
- **Issues as Code** — store issues, milestones, and labels as Markdown files with YAML frontmatter
- **Git-friendly** — `.md` files are tracked in git, so your team shares the same view
- **Self-hosted GitLab support** — works with any GitLab instance

## Quick Start

```bash
npm install -g @anthais/glsync

cd your-project
glsync init # auto-detects git remote, prompts for token
glsync pull # pull issues, milestones, labels as .md files
# edit files in .gitlab/issues/, .gitlab/milestones/, .gitlab/labels/
glsync diff # preview changes
glsync push # push changes back to GitLab
```

## Commands

| Command | Description |
|---------|-------------|
| `glsync init` | Initialize config (auto-detect git remote, prompt for token) |
| `glsync fetch` | Fetch latest data from GitLab to local cache |
| `glsync pull` | Pull and write `.md` files from GitLab |
| `glsync diff` | Show diff between local files and GitLab |
| `glsync push` | Push local changes to GitLab |

### Options

```
-r, --resource Sync only: issues, milestones, or labels
--force Overwrite without conflict check
--backup Create .bak file before overwriting (pull only)
--yes Skip confirmation prompt (push only)
```

## File Structure

After `glsync pull`, your project will look like:

```
.gitlab/
├── issues/
│ ├── 21.research-auto-time-tracking.md
│ └── 42.setup-ci-pipeline.md
├── milestones/
│ └── sprint-1.md
├── labels/
│ ├── bug.md
│ └── feature.md
└── .glsync/ # gitignored — config & cache
├── config.json
└── objects/
```

Each file uses YAML frontmatter + Markdown body:

```markdown
---
id: 42
iid: 10
title: Setup CI pipeline
labels:
- devops
- high-priority
milestone: Sprint 1
state: opened
---

Configure GitLab CI/CD for the monorepo...
```

## How It Works

glsync uses SHA-256 hashes to track changes on both sides:

- **`base_hash`** — snapshot from the last pull
- **`server_hash`** — latest state on GitLab
- **`local_hash`** — current state of your local file

```
Push: local changed + server unchanged → safe to push
local changed + server changed → conflict (pull first)

Pull: server changed + local unchanged → safe to overwrite
server changed + local changed → conflict (use --force or --backup)
```

No version numbers, no timestamps — just content hashes.

## License

MIT