1
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Sync Bridge
2
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The sync bridge mirrors Fossil repositories to GitHub and GitLab as downstream read-only copies.
4
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
5
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## How It Works
6
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
7
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```mermaid
8
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
flowchart LR
9
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Fossil["Fossil Repo<br/>(source of truth)"] --> Bridge["Sync Bridge<br/>(Celery task)"]
10
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Bridge --> Git["Git Export"]
11
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Git --> GitHub["GitHub Mirror"]
12
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Git --> GitLab["GitLab Mirror"]
13
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
14
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
15
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The bridge:
16
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
17
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
1. Exports Fossil commits as Git commits
18
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
2. Pushes to configured Git remotes
19
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
3. Optionally syncs tickets to GitHub/GitLab Issues
20
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
4. Optionally syncs wiki pages to repo docs
21
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
22
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## What Gets Synced
23
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
24
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Fossil Artifact | Git Target | Configurable |
25
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
|---|---|---|
26
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Commits | Git commits | Always |
27
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Tags | Git tags | Always |
28
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Branches | Git branches | Always |
29
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Tickets | GitHub/GitLab Issues | Optional |
30
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
| Wiki | Repository docs | Optional |
31
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
32
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Configuration
33
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
34
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Set up mirroring through the Django management UI or environment variables:
35
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
36
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
37
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# GitHub mirror
38
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
GITHUB_TOKEN=ghp_xxxxxxxxxxxx
39
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
40
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# GitLab mirror
41
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
GITLAB_TOKEN=glpat-xxxxxxxxxxxx
42
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
43
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
44
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Per-repository mirror configuration is managed in the dashboard under **Repository Settings > Sync**.
45
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
46
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
## Sync Modes
47
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
48
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### On-Demand
49
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
50
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Trigger a sync manually from the dashboard or CLI:
51
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
52
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
53
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
docker compose exec django python manage.py fossil_sync my-project
54
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
55
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
56
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Scheduled
57
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
58
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Configure a Celery Beat schedule to sync at regular intervals:
59
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
60
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```python
61
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
# Runs every 15 minutes
62
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
CELERY_BEAT_SCHEDULE = {
63
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
'sync-all-repos': {
64
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
'task': 'fossil.tasks.sync_all',
65
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
'schedule': 900.0,
66
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
},
67
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
}
68
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
69
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
70
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
### Upstream Pull
71
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
72
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
Pull updates from a remote Fossil server into your local instance:
73
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
74
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```bash
75
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
docker compose exec django python manage.py fossil_pull my-project
76
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
```
77
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
78
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
!!! warning "Direction matters"
79
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!
The sync bridge is **one-way**: Fossil to Git. Changes pushed directly to a Git mirror will be overwritten on the next sync. Always push to the Fossil repo.
80
{ copied = false; pop = false }, 1000)" :class="copied && 'copied'">
Copy link Copied!