Задать вопрос
  • Какой формат (с изменениями) эффективнее хранится в Git?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Git заточен на отслеживание только текстовых файлов. Они будут храниться эффективно, без дублирования. Двоичные файлы будут сохраняться в репо каждый раз целиком, даже если изменили один байт.
    Ответ написан
  • Как прочитать из репозитория BitBucket файл не вводя руками учётные данные и не засоряя текущий проект?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Запомните, все команды гита работают только с локальным репозиторием, для которого не нужны никакие учетки. Это просто папка на локальном компьютере, которая доступна без паролей.

    Учетки возникают только когда вы синхронизируете локальный репозиторий с внешними и тут сам гит в процессе авторизации не участвует. И в любом случае на компе должен быть уже заранее клонированный внешний репозиторий, чтобы работали команды вытаскивающие ваш файл. Напрямую обратиться к внешнему репо вы не сможете.

    Другое дело что у Bitbucket/GitHub/GitLab есть API, позволяющие вытаскивать информацию через него. И если эти API требуют авторизации, то вы наверное не сможете без авторизации обойтись. Это тоже к самому гиту не имеет отношения. Тут вы работаете лишь с API этих сайтов.
    Ответ написан
  • Как сквошить только свои коммиты?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Rebase это всегда повторная сборка ветки. Старая ветка как бы удаляется и собирается новая, с таким же названием но новым содержимым. Вы точно уверены что хотите проделать это с общей веткой? Ведь тогда коллегам тоже у себя придётся удалить эту ветку и скачать заново вашу новую.

    А чтобы объединить какие-то коммиты, вы должны поменять порядок коммитов в новой ветке, чтобы ваши коммиты оказались рядом. Только так. При этом как правило вылезут конфликты, из-за разного порядка коммитов. Вы точно хотите продолжать?
    Ответ написан
  • Как синхронизировать два репозитория Git между собой и с репозиторием SVN?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Вы наверное невнимательно читали документацию к SubGit.
    Он подключается к голому репозиторию напрямую, и затем синхронизация происходит автоматически.

    As soon as initial translation is completed, repos.git is ready to serve users. Pushes to repos.git will be translated to SVN and commits to SVN will be translated to Git.
    Note, that repos.git is so called ‘bare’ Git repository, i.e. it does not contain working tree.

    Никакой рабочий каталог он не синхронизирует.
    Ответ написан
    Комментировать
  • Как перенести репозиторий из SVN в GitLab?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Скрипт svn2git собирает Git-репозиторий локально, уже затем вы его отправляете в любой внешний репозиторий. Например, в GitLab.

    Даже в инструкции просят устанавливать скрипт на ваш локальный компьютер, а не на сервер GitLab.
    Install svn2git on a local workstation rather than the GitLab server

    А вы зачем-то заходите в консоль гитлаба и там что-то делаете. Это ошибка, используйте свой компьютер.
    Ответ написан
    6 комментариев
  • Как удалить закрытый pull request?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Pull Request в GitHub-репозитории можно только закрыть. Удалить созданный ранее PR невозможно.
    Ответ написан
  • Как это расшифровать?

    sergey-kuznetsov
    @sergey-kuznetsov
    Автоматизатор
    Если нужен ответ на вопрос как расшифровать, то вот так:
    import java.nio.ByteBuffer;
    import java.nio.charset.Charset;
    import java.nio.charset.StandardCharsets;
    
    public class Main {
    
        public static void main(String[] args) {
            
            byte[] rawBytes = Charset.forName("Windows-1251")
                    .encode("ГђВќГђВµ ГђВЅГђВ°").array();
            String asUTF8 = StandardCharsets.UTF_8
                    .decode(ByteBuffer.wrap(rawBytes)).toString();
            byte[] bytes = StandardCharsets.ISO_8859_1
                    .encode(asUTF8).array();
            String result = StandardCharsets.UTF_8
                    .decode(ByteBuffer.wrap(bytes)).toString();
    
            System.out.println(result); // Не на ...йден...?
        }
    }


    Этот код не гарантирует полное восстановление конечно, но хотя бы текст станет читабельным.
    Проблема в том что изначальный поток байтов utf-8 был интерпретирован как ISO-8859-1/Latin-1/ASCII, но сохранён снова как utf-8. Затем строка была выведена в консоль под видом строки Windows-1251.
    Ответ написан
    Комментировать
  • Как сделать push от своего аккаунта Git так, чтобы было видно имя другого пользователя?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    В гите нет никаких аккаунтов. Репозиторий лежит локально и у вас сразу к нему доступ безо всяких паролей. Коммиты вы подписываете любым именем и мылом, каким вздумается. И эту подпись у коммита в дальнейшем невозможно изменить даже если захотеть. И тем более она никак не поменяется при передаче на другой компьютер.

    Аккаунт, под которым вы делали push, никак не отразится на самих коммитах. Каким именем вы их подписали при создании, то имя и останется в них навсегда.
    Ответ написан
    Комментировать
  • Как в LibGit2Sharp сделать клон репозитория с заменой файлов?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Клонирование с заменой файлов не делается никак. В гите нет такой команды.

    Вы должны либо очистить целевой каталог перед клонированием, либо как правильно подсказал Василий — просто отменить изменения, ничего не скачивая заново.
    Ответ написан
    Комментировать
  • Libgit2Sharp. Ошибка: There is no tracking information for the current branch. Как сделать git pull?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Зачем вам Pull? Делайте Clone и всё автоматом свяжется.

    exists and is not an empty directory
    Клонировать мы должны либо в пустой каталог, либо в ещё не существующий.

    Если вы этого не понимаете, то вам нужно срочно учить Git. Это важный навык для программиста.

    Почитав ваши предыдущие вопросы, мне показалось что вы вообще не понимаете что делаете. Если вы хотите отменить изменения файлов в рабочем каталоге, то ничего заново клонировать не надо. Весь код у вас уже лежит в локальном репозитории. Вам нужно лишь откатить изменения до того состояния, которое в локальном репозитории.

    git reset --hard

    #### LibGit2Sharp
    using (var repo = new Repository("path/to/your/repo"))
    {
        Commit currentCommit = repo.Head.Tip;
        repo.Reset(ResetMode.Hard, currentCommit);
    }
    Ответ написан
  • Есть ли альтернатива cherry-pick для отмены коммитов?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Что-то не очень понятно что вы хотите сделать.
    Если надо просто переключиться в старое состояние, то сбросьте ветку до этого состояния.
    git reset --hard адрес_старого_состояния
    Тут нет нужды отменять какие-то коммиты.
    Ответ написан
    Комментировать
  • Как правильно сделать изменения в Git?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Нет никакой разницы, переименовываете вы руками или через команду git mv.
    А вот пихать все эти манипуляции в один коммит — неправильно.
    Сначала удалите первую папку и закоммитьте.
    Затем переименуйте на диске вторую папку и снова закоммитьте новое состояние.
    Ответ написан
    Комментировать
  • Как скрыть Pull Request от других пользователей?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Вы наверное хотите скрыть не сам Pull Request, а код, который виден там.
    Но ведь этот код студенты отправляют из своих открытых проектов в ваш открытый проект. Значит код в любом случае виден всем в интернете, причем даже без создания PR.
    Единственный способ скрыть код — публиковать его в закрытые проекты.
    Пусть студенты создают приватные репозитории и дают вам доступ туда.
    Ответ написан
    Комментировать
  • Как правильно слить ветки?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Сначала влить мастер к себе в ветку, чтобы у вас папка тоже переименовалась.
    git merge master mybranch
    Потом свою ветку влить в мастер, чтобы уже ваши правки ушли в мастер.
    git merge mybranch master
    Ответ написан
    Комментировать
  • Как решить проблему с мерджем?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    В файл ORIG_HEAD перед началом операций записывается указатель на вершину текущей ветки. Видимо этот файл у вас испортился.
    Удалите его вручную.
    Ответ написан
    Комментировать
  • GitHub Pages дает ошибку. Как исправить?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Проверяйте файл .gitmodules
    Смотрите откуда подгружается подмодуль и доступен ли его репозиторий из GitHub.
    Ответ написан
    Комментировать
  • Как почистить каталог .git от ненужных файлов?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Файл .gitignore не предназначен для удаления файлов из репо, он лишь помогает не добавить случайно лишнее в репо. А если уже закоммитили, то игнор не поможет.

    Самый надёжный способ вычистить репозиторий от файла — использовать скрипт filter-repo
    # клонируем репозиторий в соседний каталог
    # иначе придётся использовать ключ --force
    git clone --no-local . ../clonerepo/
    # переходим в свежий клон
    cd ../clonerepo
    # чистим
    git filter-repo --path "path/to/file" --invert-paths
    # проверим что файл исчез
    git log --oneline --name-status -- "path/to/file"
    Коммиты в гите неизменяемые, но мы можем их пересоздать заново. Фактически получится новый репозиторий, но сохранится история. Всем участникам проекта придётся клонировать новый проект заново.
    Ответ написан
    3 комментария
  • Как авторизоваться на GitHub?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    После нажатия «Войти через браузер» должен открыться собственно браузер со страницей гитхаба, где вы должны нажать кнопочку «Разрешить».
    Если вы не разрешили или что-то пошло не так, то только тогда вылезет предложение ввести пароль в терминале. Но там вместо пароля нужно вводить не ваш гитхабовский пароль, а текст токена, который вы должны были заранее создать. Токен вам покажут только один раз, поэтому скопируйте его в буфер и сохраните где-нибудь.
    И вставляйте его в терминале тоже через буфер обмена, чтобы не ошибиться. При вводе паролей с терминале их никогда не видно, не пугайтесь и просто жмите Enter после ввода.
    Ответ написан
    Комментировать
  • Как добавлять изменения в репозиторий git с разных компьютеров?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Просто скопируйте закрытый ключ с одного компа на другой и всё. Либо создайте новую пару на втором компе и добавьте ещё один открытый ключ на гитхаб.
    Ответ написан
    2 комментария
  • Сделал merge в локальный develop из branch-1, потом push на origin, а теперь получается что нужно откатить develop. Что делать?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Если ветка на origin не защищена от удаления, то
    git push --force
    А на других компьютерах, например на VPS
    git pull --rebase
    Чтобы ветка там тоже удалилась и пересобралась заново.
    Ответ написан
    2 комментария