<p align="center">
<img src="assets/icon.svg" height="128" alt="Иконка gitow" />
</p>
<p align="center">
<a href="https://github.com/WhoSowSee/gitow/graphs/contributors"><img src="https://img.shields.io/github/contributors/WhoSowSee/gitow?style=for-the-badge&color=CBA6F7&labelColor=302D41&logo=data:image/svg%2Bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iI2NkZDZmNCIgZD0iTTkgMTFhNCA0IDAgMSAwIDAtOCA0IDQgMCAwIDAgMCA4Wm0wIDJjLTMuOSAwLTcgMi03IDQuNVYyMGgxNHYtMi41QzE2IDE1IDEyLjkgMTMgOSAxM1ptOC41LTEuNWEzLjI1IDMuMjUgMCAxIDAgMC02LjUgMy4yNSAzLjI1IDAgMCAwIDAgNi41Wm0wIDEuOGMtLjkgMC0xLjc1LjE1LTIuNS40MiAxLjcgMS4wNSAyLjcgMi40NSAyLjcgMy45OFYyMEgyMnYtMi4zYzAtMi40LTItNC40LTQuNS00LjRaIi8+PC9zdmc+" alt="CONTRIBUTORS"></a>
<a href="https://github.com/WhoSowSee/gitow/forks"><img src="https://img.shields.io/github/forks/WhoSowSee/gitow?style=for-the-badge&color=89B4FA&labelColor=302D41&logo=data:image/svg%2Bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI%2BPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIgMTIpIHNjYWxlKDEuMDgpIHRyYW5zbGF0ZSgtMTIgLTEyKSI%2BPHBhdGggZmlsbD0iI2NkZDZmNCIgZD0iTTYgM2EzIDMgMCAxIDAgMCA2IDMgMyAwIDAgMCAwLTZabTEyIDBhMyAzIDAgMSAwIDAgNiAzIDMgMCAwIDAgMC02Wk0xMiAxNWEzIDMgMCAxIDAgMCA2IDMgMyAwIDAgMCAwLTZaIi8%2BPHBhdGggZmlsbD0iI2NkZDZmNCIgZD0iTTUgOGgydjIuNGMwIC4zMy4yNy42LjYuNmg4LjhjLjMzIDAgLjYtLjI3LjYtLjZWOGgydjIuNGEyLjYgMi42IDAgMCAxLTIuNiAyLjZIMTN2MmgtMnYtMkg3LjZBMi42IDIuNiAwIDAgMSA1IDEwLjRWOFoiLz48L2c%2BPC9zdmc%2B" alt="FORKS"></a>
<a href="https://github.com/WhoSowSee/gitow/stargazers"><img src="https://img.shields.io/github/stars/WhoSowSee/gitow?style=for-the-badge&color=F9E2AF&labelColor=302D41&logo=data:image/svg%2Bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI%2BPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtMS42KSI%2BPHBhdGggZmlsbD0iI2NkZDZmNCIgZD0iTTEyIDIuNSAxNC45IDguNGw2LjUgMWEuOC44IDAgMCAxIC40NSAxLjM2bC00LjcgNC41OCAxLjEgNi40NWEuOC44IDAgMCAxLTEuMTYuODRMMTIgMTkuOTUgNi4yIDIyLjYzYS44LjggMCAwIDEtMS4xNi0uODRsMS4xLTYuNDUtNC43LTQuNThBLjguOCAwIDAgMSAxLjkgOS40bDYuNS0xTDEyIDIuNVoiLz48L2c%2BPC9zdmc%2B" alt="STARS"></a>
</p>
<p align="center">
<a href="https://crates.io/crates/gitow"><img src="https://img.shields.io/crates/v/gitow?style=for-the-badge&color=FAB387&logo=data:image/svg%2Bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNiAxNiI%2BCjxwYXRoIGZpbGw9IiNjZGQ2ZjQiIGQ9Ik0xLjUgNi45ODRWMTFsNi41MDMgMy41TDE0LjUgMTFWM0wxMSAxLjVsLTYuNSAzdjF6Ii8%2BCjxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzMwMkQ0MSIgc3Ryb2tlLXdpZHRoPSIuOSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIj4KPHBhdGggZD0iTTEuNSA3TDggMTAuNUwxNC41IDdtLTEwLTIuNWwzLjUwMyAyTDE0LjQ5OCAzTTQuNSA1LjV2N20zLjUtNlYxNCIvPgo8cGF0aCBkPSJNOC4wMDMgM0wxMS41IDQuNXY4Ii8%2BCjwvZz4KPC9zdmc%2B&labelColor=302D41" alt="CRATES.IO"></a>
<a href="https://crates.io/crates/gitow"><img src="https://img.shields.io/crates/d/gitow?style=for-the-badge&color=A6E3A1&logo=data:image/svg%2Bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNiAxNiI%2BCjxwYXRoIGZpbGw9IiNjZGQ2ZjQiIGQ9Ik0xLjUgNi45ODRWMTFsNi41MDMgMy41TDE0LjUgMTFWM0wxMSAxLjVsLTYuNSAzdjF6Ii8%2BCjxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzMwMkQ0MSIgc3Ryb2tlLXdpZHRoPSIuOSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIj4KPHBhdGggZD0iTTEuNSA3TDggMTAuNUwxNC41IDdtLTEwLTIuNWwzLjUwMyAyTDE0LjQ5OCAzTTQuNSA1LjV2N20zLjUtNlYxNCIvPgo8cGF0aCBkPSJNOC4wMDMgM0wxMS41IDQuNXY4Ii8%2BCjwvZz4KPC9zdmc%2B&labelColor=302D41" alt="DOWNLOADS"></a>
</p>
<h2 align="center">Открывайте страницы Git-репозиториев из командной строки</h2>
<p align="center">
<img width="800px" alt="preview" src="https://github.com/user-attachments/assets/a75fd3d4-a8f4-4c1b-a853-887ad8d84488"/>
</p>
> [!TIP]
> **English version:** [README.md](README.md)
> [!NOTE]
> **gitow - git open web.** Rust CLI для открытия веб-страниц репозитория из текущего рабочего дерева. В её арсенале:
>
> - **Навигация по репозиторию** - Открытие корня репозитория, веток, коммитов, issue, pull request или merge request, истории коммитов, релизов, отслеживаемых файлов и произвольных URL-суффиксов.
> - **Разбор remote** - Поддержка имён remote, прямых remote URL, `insteadOf`-переписываний и алиасов из SSH config.
> - **Ссылки с учётом ветки** - Выбор upstream-ветки, текущей ветки, точного тега или SHA текущего коммита в зависимости от состояния репозитория.
> - **Работа с несколькими remote** - Открытие всех настроенных remote через `--all-remotes`, при этом `origin` идёт первым.
> - **Вывод для скриптов** - Печать URL через `--print` или `BROWSER=echo` без запуска браузера.
> - **Короткая поверхность команд** - Один компактный бинарник `gitow` покрывает все цели навигации.
> [!IMPORTANT]
>
> ## Требования:
>
> - Git
> - Rust 1.95 или новее
> - Системная команда запуска браузера или переменная `BROWSER`
## Установка
### Установка с crates.io
```bash
cargo install gitow
```
Так вы установите последнюю опубликованную версию из crates.io в каталог бинарников Cargo.
### Установка из исходников
```bash
git clone https://github.com/WhoSowSee/gitow.git
cd gitow
cargo install --path .
```
Команда соберёт `gitow`, затем поместит бинарник в каталог Cargo, обычно `~/.cargo/bin`.
### Запуск без установки
```bash
cargo build --release
./target/release/gitow --print
```
Запуск через Cargo:
```bash
cargo run --bin gitow -- --print
```
## Использование
```text
gitow [OPTIONS] [REMOTE_OR_URL] [BRANCH]
```
Примеры:
```bash
gitow
gitow upstream
gitow upstream feature/my-branch
gitow git@github.com:owner/repo.git
gitow https://gitlab.example.com/group/project.git main
gitow --print
```
### Цели навигации
- `-c, --commit` - открыть текущий коммит в интерфейсе forge.
- `-i, --issue` - открыть issue, извлечённую из имени текущей ветки.
- `-m, --pull-requests` - открыть страницу pull request или merge request.
- `-C, --commits` - открыть страницу коммитов выбранной ветки или ref.
- `-r, --releases` - открыть страницу релизов, если forge её поддерживает.
- `-a, --all-remotes` - открыть все настроенные remote.
- `-f, --file <PATH>` - открыть отслеживаемый файл по пути относительно репозитория.
- `-s, --suffix <SUFFIX>` - добавить произвольный суффикс к сгенерированному URL.
- `-p, --print` - напечатать URL вместо запуска браузера.
- `-h, --help` - показать справку.
### Частые сценарии
```bash
gitow --commit
gitow --issue
gitow --pull-requests
gitow --commits
gitow --releases
gitow --all-remotes
gitow --file src/main.rs
gitow --suffix actions
gitow --print
```
## Выбор remote и ветки
По умолчанию `gitow` открывает:
1. `open.default.remote`, если он настроен.
2. Tracked remote текущей ветки, если он настроен.
3. `origin`.
Для ref используется upstream-ветка выбранной ветки, если она есть, иначе текущая ветка. В detached `HEAD` утилита сначала пробует точный tag, затем SHA текущего коммита.
## Поддерживаемые remote-репозитории
`gitow` определяет URL-схемы для:
- GitHub
- GitHub Gist
- GitLab.com и self-hosted GitLab
- Gitea, Forgejo, Gogs и Codeberg
- Bitbucket Cloud
- Bitbucket Server / Atlassian Stash
- Azure DevOps / Visual Studio Team Services / Team Foundation Server
- AWS CodeCommit
- generic Git hosting URL
Некоторые страницы зависят от forge. Релизы поддерживаются для GitHub, GitLab и Gitea-совместимых forge. AWS CodeCommit не поддерживает shortcut для issue.
## Конфигурация
`gitow` использует обычную конфигурацию Git. Добавьте `--global`, чтобы применить параметр ко всем репозиториям.
### Remote по умолчанию
Задайте remote, который должен открываться без явного аргумента:
```bash
git config open.default.remote upstream
```
### Пользовательский web-домен и протокол
Если хост Git remote отличается от хоста web UI, настройте URL-matched overrides:
```bash
git config "open.https://git.example.com.domain" "repo.intranet/subpath"
git config "open.https://git.example.com.protocol" "http"
```
Например, remote:
```text
ssh://git@git.example.com:7000/team/repo.git
```
может открываться как:
```text
http://repo.intranet/subpath/team/repo
```
### Gitea, Forgejo и Gogs
Gitea-совместимые forge используют другой формат URL для веток. Codeberg и домены, содержащие `gitea`, `forgejo` или `gogs`, определяются автоматически. Для пользовательских доменов задайте тип forge явно:
```bash
git config "open.https://git.internal.example.forge" "gitea"
```
Значения `gitea`, `forgejo` и `gogs` нормализуются в `gitea`.
### Алиасы SSH config
SCP-style remote могут разрешаться через алиасы SSH config:
```text
Host work
HostName git.internal.example
```
```bash
git remote set-url origin work:team/repo.git
gitow --print
# печатает https://git.internal.example/team/repo
```
Утилита сначала читает путь из переменной окружения `GITOW_SSH_CONFIG`, затем использует `$HOME/.ssh/config`, если файл существует.
## Выбор браузера и отладка
По умолчанию `gitow` использует системный launcher:
- Windows: `cmd /C start`
- macOS: `open`
- Linux: `xdg-open`
- WSL: Windows PowerShell `Start`
Задайте `BROWSER`, чтобы использовать конкретную команду:
```bash
BROWSER=firefox gitow
```
Используйте `--print` или `BROWSER=echo`, чтобы проверить сгенерированные URL без открытия браузера:
```bash
gitow --print
BROWSER=echo gitow
```
## Разработка
```bash
cargo fmt --check
cargo clippy --all-targets -- -D warnings
cargo test
```
## Star History
<p align="center">
<a href="https://starchart.cc/WhoSowSee/gitow">
<picture>
<source
media="(prefers-color-scheme: dark)"
srcset="https://starchart.cc/WhoSowSee/gitow.svg?variant=custom&background=%230d1117&axis=%238b949e&line=%232f81f7"
/>
<source
media="(prefers-color-scheme: light)"
srcset="https://starchart.cc/WhoSowSee/gitow.svg?variant=custom&background=%23ffffff&axis=%2357606a&line=%230969da"
/>
<img
alt="Stargazers over time"
src="https://starchart.cc/WhoSowSee/gitow.svg?variant=custom&background=%23ffffff&axis=%2357606a&line=%230969da"
/>
</picture>
</a>
</p>
<p align="center">
<img src="https://raw.githubusercontent.com/catppuccin/catppuccin/main/assets/footers/gray0_ctp_on_line.svg?sanitize=true" alt="catppuccin" />
</p>
<p align="center">
<i><code>© 2026-present <a href="https://github.com/WhoSowSee">WhoSowSee</a></code></i>
</p>
<p align="center">
<a href="https://github.com/WhoSowSee/gitow/blob/main/LICENSE"><img src="https://img.shields.io/github/license/WhoSowSee/gitow?style=for-the-badge&color=CBA6F7&logoColor=cdd6f4&labelColor=302D41" alt="LICENSE"></a>
</p>