Ответы пользователя по тегу Git
  • Как получить список всех удаленных файлов из всех коммитов?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    git log --diff-filter=D --summary | grep delete
    Ответ написан
    Комментировать
  • Как в Git в организовано хранение файлов?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    Вообще-то как раз гит хранит целые копии файла.
    Для каждого файла создается его хеш, и файл-объект хранится под именем с этим кешом.

    If you again examine your objects directory, you can see that it now contains a file for that new content. This is how Git stores the content initially — as a single file per piece of content, named with the SHA-1 checksum of the content and its header. The subdirectory is named with the first 2 characters of the SHA-1, and the filename is the remaining 38 characters.


    То есть любое изменение файла - создает еще один файл-объект.
    Два одинаковых файла не будут занимать два места, даже если они хранятся под разными именами.

    Каждый коммит - содержит список файлов и хеш для содержимого.
    А ветка - это просто ссылка на конкретный коммит и немного метаданных.

    Также файлы-объекты хранятся упакованными, а периодически файлы-объекты могут быть объеденены в отдельный пакет.

    Чтобы посмотреть содержимое любого гит-объекта, юзай
    git cat-file -p ID_объекта (где айди объекта это как раз его хеш)

    И собственно именно эта фича - хранение каждого изменения файла отдельным объектом и позволило создать легковесные ветки, где переключение на любой коммит любой ветки - быстрая проверка и копирование файлов, в отличие от CVS и SVN, где любое переключение ветки - куча пересчетов диффов как назад так и вперед.

    Но, поскольку SVN - централизированная система, где все изменения хранятся только на сервере, можно менять формат хранения между версиями, так как это не нужно согласовывать со всеми пользователями репозитория.
    Например кроме диффов, в поздних SVN периодически сохраняются полные снепшоты, например каждые 1000 коммитов делается полный слепок, что ускоряет перерасчеты.
    Ответ написан
  • Алгоритм или бестпрактис для синхронизации .dotfiles?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer

    Предполагаю, что можно сделать его зашифрованным через openssl и именно его синхронизировать или даже версионировать через git (или оставить текущую схему с ансибл). При входе в систему расшифровывать его, кладя в RAM и подключать через "source .bashrc". Работать. После окончания рабочего дня расшифрованный файл надо удалить (ну или изначально при начале работы класть его в RAM).
    Но в этот файл регулярно вносятся изменения, бывает раз в день, а бывает лишь один раз в месяц.


    Не самый плохой вариант шифровать через openssl.
    Только зачем расшифровывать файл? Расшифровывайте прямо в память во время использования

    то есть в .bashrc можно например так

    dbuser=database_user
    dbpass="$(openssl enc -d -base64 -aes-128-ctr -nopad -k secret_key.txt<<<"l1k2j3kl14jjkl321h4lk124123;ljk2`13jlkj")"

    Синтаксис из головы написал, надо уточнить как указать путь к файлу с мастер секретом.
    При этом файл остается зашифрованным, но в текущей сесии переменная уже с открытым паролем.
    Либо можно сделать несколько файлов подобного типа и инклюдать их в скрипты прямо перед использованием.
    Ответ написан
    Комментировать
  • Как правильно мержить в main из dev, если там есть незаконченные фичи?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    пока фича не доделана - не мержить.
    мержом в мейн нужно смержеть мейн в свою фича ветку, убедиться что нет конфликтов ни по синтаксису ни по логике. Если фича долго в разработке можно в принципе периодически мержить в нее мейн, чтобы не сильно отставать и уменьшить работу на потом.

    А уже потом мержить в мейн, в идеале еще и со squash

    Есть еще варианты более сложные, если фичу разделяют на разные спринты, на разные команды - тогда внедряешь заглушки или конфиг/апи для включения/выключения фичи
    Ответ написан
  • Как сделать исключение в .gitignore?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    It is not possible to re-include a file if a parent directory of that file is excluded. Git doesn’t list excluded directories for performance reasons, so any patterns on contained files have no effect, no matter where they are defined.

    Можно только добавить разово .pub руками.
    Ответ написан
    5 комментариев
  • Как исключить файл из Pull Request?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    Как я понял, вы хотите в одном и том же репозитории хранить два енвайрнмента, на одной и той же машине.
    Но это неверный подход. Ветки это не разные версии софта, ветки это разные состояния исходников.
    Сделайте ваш код, чтобы там был prod.config, dev.config и все
    Ответ написан
    2 комментария
  • Как настроить ssh config файл для gitflic.ru?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    так а почему у вас https:// а не ssh:// ?
    Ответ написан
    Комментировать
  • Как происходит работа с Git в крупных проектах?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    В проекте имеются ветви: master, dev, release и features. Я создал feature от master и, при попытке слияния с dev, вижу, что моя ветка отстаёт от dev на 200 коммитов


    Тогда может надо было создавать feature от dev, а не от master?
    или выяснить почему ваш dev так отстает от master

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

    200 коммитов разницы это довольно много, или слишком долго висел feature или реально бардак в проекте.
    Ответ написан
    Комментировать
  • Можно ли сказать, что Гит работает на блокчейне?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    нет.
    Несложно же почитать как под капотом работает гит. Никаких блоков цепочек там нет. Есть версии.
    Ответ написан
    Комментировать
  • Как называется такая практика и является ли она приемлемой?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    Ветка отпочковывается от любого коммита. Обычно руками никто не создает ветку из старых коммитов, делают из последнего свежего.
    Просто весь смысл ветки в том, чтобы свою фичу пилить не блокируя мастер или релиз

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

    P.S. в фичаветку можно периодически мержить из мастера, чтобы держать свою ветку "свежей" и в конце, при мерже в мастер, вероятность конфликтов была меньше.

    А так - обычный feature-branch flow
    Ответ написан
    Комментировать
  • Как настроить Git для работы с Си/Си++?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    В официальной документации, минимальная настройка заключается в том, что нужно указать user.name и user.email, что используется при коммитах
    Ответ написан
    Комментировать
  • Как использовать несколько ключей SSH для разных аккаунтов Github через KeePassXC?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    Можно настроить config для ссш и юзать разные хостнеймы для конкретных репозиториев
    Пример:

    ~/.ssh/config:
    Host github-user1
          HostName github.com
          User git
          IdentityFile ~/.ssh/id_rsa_user1
    
        Host github-user2
          HostName github.com
          User git
          IdentityFile ~/.ssh/id_rsa_user2


    В разных репозиториях редактируешь ремоут (.git/config)
    url = git@github-user1:user1/myrepo.git
    или
    url = git@github-user2:user2/myrepo.git

    ну или можно командой
    git remote set-url origin git@github-user1:user1/repo.git
    Ответ написан
    3 комментария
  • Почему изменения сохраняются и на новой ветке и в main?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    без коммита, вы не фиксируете изменения в ветке, а только в working directory
    Проверьте все изменения, добавьте их в коммит, закоммитьте, а уже потом переключайтесь в другую ветку

    Либо юзайте git stash
    Ответ написан
    Комментировать
  • Как правильно организовать работу с Git для соло-разработки?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    Если ты один, сделай флоу какой тебе удобный с нейм конвеншеном какой тебе удобен.

    Сделай две ветки:
    site-ru
    dev-site-ru

    Делай ветки для вставки новых крупных фич типа:
    feature-XXXX

    как ветка готова, мержи ее в dev-site-ru c --squash
    Как протестировал на дев, делай мерж в site-ru

    Для тебя и клиента будет интуитивно понятно что за ветки, и не надо будет запоминать зачем нужен мастер или транк.
    Ответ написан
    3 комментария
  • Как организовать парную разработку с Git для отладки на сервере?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    Банально сделать несколько "енвайрнментов", то есть тестовых ботов, и привязать ветки к этим веткам.

    Намример можно привязать к именованиям бренчей, и создать заранее токены для release-bot, main-bot, dev1-bot, dev2-bot.
    Каждый разработчик делает свои ветки согласно dev1/feature-blabla и так далее.

    Триггер на сервере, что если пришел коммит в ветку по указанной регулярке - пересобрать и перезапустить бота с его токенами.
    Ответ написан
  • Как настроить тестовый сервер, чтобы одновременно можно было тестировать несколько версий проекта?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    В вашем случае было бы удобнее всего работать с докером.
    При этом все тесты должны быть автоматическими и запускаться на localhost

    Любым CI инструментом настраиваете триггер на коммит или пулл реквест, чтобы собрать проект, сбилдить докер образ, запустить его и внутри запустить автотесты.

    Для ручных тестов, конфигурация будет гораздо, гораздо сложнее, тут уже не вопрос на тостер, а масштабная работа.
    Ответ написан
    2 комментария
  • Как сделать cherry pick?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    Мне нужно изменения из 2(Б) ветки закинуть в ветку 1(А). Что я делаю:

    Черри пик это про коммит, а не про ветку

    Возможно тебе нужен rebase или merge, а не черри пик?
    Ответ написан
    3 комментария
  • Почему не получается склонировать репозиторий?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    Я больше подозреваю, что путь кривой. пробелы, точки, русские буквы.
    Может пушили с Линукс, а с винды такой путь не смог склонироваться.

    Кстати, на Stackoverflow обсуждают слишком длинные имена.
    Тоже можно проверить. русские буквы - в utf8 занимают больше байт, чем английские.
    можно попробовать
    git config --system core.longpaths true or edit gitconfig (от админа)
    или попробовать склонить в папку ближе к корню диска.
    Ответ написан
    1 комментарий
  • Как увидеть все файлы, которые добавили в git?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    Да любой гит клиент это умеет.
    Например в консоли

    git ls-files

    Ну и любой gui клиент для git должен это уметь.
    Ответ написан
    5 комментариев
  • Как удалить merge commit из проекта?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    А зачем?
    Вы хотите это запушить? Тогда поменяется история для всех участников, и они все должны с этим согласиться и скачать новый вариант ветки с коммитами. Сможете синхронизировать эту активность для всех участников? (тут скорее всего самый простой вариант, что вы у себя удаляете этот коммит, например переделывая всю ветку через rebase или rebase со squash, а остальные участники удаляют у себя весь репозиторий и скачивают его с нуля).

    Но зачем такое делать? Коммит в ветке просто показатель что в этом месте был мерж из другой ветки, и чтобы не было мерж коммитов по идее надо было во время мержа выбирать вариант
    Ответ написан
    7 комментариев