gitow 1.0.0

Open Git remotes and repository pages in your browser from the CLI
Documentation
<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>&copy 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>