Nano Hash - криптовалюты, майнинг, программирование

Git — Как автоматически отправлять изменения в каталоге в другую ветку

Полная переработка вопроса

Поэтому я думал, что объясняю этот вопрос очень просто и прямо, но кажется, что я слишком упростил, так что вот все дополнительные детали. Надеюсь, это поможет всем увидеть, что это тоже не дубликат.


У меня есть репозиторий (проект), в котором я хотел бы автоматизировать процесс отправки коммитов из одного каталога ветки в другую ветку; что-то я еще не сталкивался с SO.

Вот мой проект с полной структурой:

[PROJECT MASTER BRANCH]
|- gh-pages    (directory)
|- css         (directory)
|- index.html  (file)
|- readme.md   (file)

[PROJECT gh-pages BRANCH]
|- (empty at the moment)

Что я надеюсь сделать, так это создать хук, который будет автоматически обрабатывать изменения в моем каталоге gh-pages из ветки master, и копировать/клонировать/заменять их (в зависимости от того, какой термин использовать правильно) в ветку gh-pages, проекты ветка сайта. Вот пример со всеми остальными файлами:

[PROJECT MASTER BRANCH]
|- gh-pages         (directory)   <=== SEE UPDATE BELOW [A]
|  |- css           (directory)
|  |  |- style.css  (file)
|  |- index.html    (file)

[PROJECT gh-pages BRANCH]
|- css           (directory)   <=== SEE UPDATE BELOW [B]
|  |- style.css  (file)
|- index.html    (file)

Я совершенно новичок в этом уровне Git Hub. Обычно я просто придерживаюсь основ и никогда не использую терминал/оболочку. Итак, чтобы прояснить, что я надеюсь сделать, я хотел бы:

  • Работать нужно только в [Master Branch]. Все изменения, которые мне нужно внести в [Ветвь gh-pages], я делаю в каталоге gh-pages [Главной ветки].
  • Предпочтительно выполнить это, добавив простой файл, который кажется перехватчиком после получения?

Вот некоторый код хука после получения, который я пытался использовать (я сделал его, изучив несколько вещей), но он не работает:

#!/bin/bash
while read oldrev newrev refname
do
    branch=$(git rev-parse --symbolic --abbrev-ref $refname)
    if [ "master" == "$branch" ]; then
        git checkout gh-pages
        git checkout master -- gh-pages
        git add gh-pages
        git commit -m "Updating project website from 'master' branch."
    fi
done

ПРИМЕЧАНИЕ
Как упоминалось в моем комментарии: это не дубликат. Это не вопрос о том, как нажать, а скорее о том, как добавить другие команды, которые автоматически запускаются, когда я делаю обычное нажатие. Эти команды будут выполнять дополнительную работу, упомянутую в моем OP.

ОБНОВЛЕНИЕ
Я добавил эти стрелки в части кода, на которые я ссылаюсь ниже: ‹===

[A] Здесь должно произойти то, что Git должен рекурсивно читать директорию gh-pages главной ветки и копировать из нее только то, что было обновлено (или все, что проще) в ветку gh-pages.

[B] Таким образом, если каталог gh-pages в master имеет файл index.html, а папка css с файлом style.css должна копировать только эту структуру, а не сам каталог gh-pages. Ниже приведен пример плохого хука, который также копирует каталог gh-pages:

[PROJECT gh-pages BRANCH]
|- gh-pages         (Directory)   <=== NOT SUPPOSED TO HAPPEN
|  |- css           (directory)
|  |  |- style.css  (file)
|  |- index.html    (file)

Кроме того, хук не должен копировать какие-либо другие файлы, кроме того, что находится внутри gh-страниц. Даже если несколько других файлов изменились в ветке master, следует скопировать только файлы каталога gh-pages.

[C] НОВЫЙ КОД - работает, но вызывает ошибку:

#!/bin/bash
branch=$(git rev-parse --abbrev-ref HEAD)
if [ "master" == "$branch" ]; then
    git fetch && git checkout gh-pages
    git checkout master -- gh-pages/*
    git add -A
    git commit -m "Updating project website from 'master' branch."
    git push -u origin gh-pages
fi

Это не сработает по двум причинам. 1) Если репо отстает от коммитов, оно не может с этим справиться, оно выдаст ошибку; если вместо извлечения используется извлечение, локальное репо стирается следующим образом:

«Локальное

Если я оставлю выборку, локальное репо останется таким, каким должно быть:

Локальное репо в том виде, в котором оно должно оставаться после нажатия. Здесь использовался Fetch.

2) Весь каталог gh-pages по-прежнему копируется в ветку gh-pages, а не только файлы внутри него.

05.02.2016

  • Возможный дубликат Как автоматически нажать после фиксации в git? 05.02.2016
  • @gzh это не дубликат. Это не вопрос о том, как нажать, а скорее о том, как добавить другие команды, которые автоматически запускаются, когда я делаю обычное нажатие. Эти команды будут выполнять дополнительную работу, упомянутую в моем OP. Этот вопрос касается автоматизации всего цикла Git каждый раз, когда пользователь делает фиксацию, не фиксируя мастер и одновременно клонируя каталог в совершенно другую ветку. 05.02.2016
  • Похоже, вам нужно написать хук после получения, чтобы выполнить эту задачу. 05.02.2016
  • @гж шишка. Переформулировал вопрос. Хук после получения имеет смысл, но я не понимаю, как это реализовать. 06.02.2016
  • Ожидается, что скрипт-ловушка будет находиться в каталоге $your_repo/hooks/post-receive, тогда в каком каталоге работает ваш скрипт-ловушка и куда будет помещен код проверки? Я думаю, вам следует создать новую папку, клонировать исходный код и делать то, что вы хотите. 07.02.2016
  • Он есть, и у меня нет опыта их кодирования. Вы можете ответить на ОП рабочим примером. По крайней мере, я учусь, работая над кодом, а не создавая его из кусочков. Между прочим, я использую git для окон, чтобы отправлять все свои коммиты. 07.02.2016
  • Мне пока неудобно писать рабочий пример, но Вот пример хука, работающего в Windows. Удачи. 07.02.2016

Ответы:


1

Вам действительно не нужен этот сложный подход.

Просто добавьте свой собственный репозиторий в качестве подмодуля (сам по себе!), подмодуль, следующий за веткой gh-pages (поскольку подмодуль может следовать за последней фиксацией филиал)!

git checkout master
git rm -r gh-pages # save your data first
git submodule add -b gh-pages -- /remote/url/of/your/own/repo
git commit -m "ADd gh-pages branch as submodule"
git push

Таким образом, вы можете менять файлы либо в своей основной ветке, либо в папке gh-pages (которая на самом деле является подмодулем)

Всякий раз, когда вы вносите изменения в папку gh-pages, не забудьте зафиксировать их там, и в основной папке вашего репозитория, чтобы записать новый gitlink (специальная запись в указателе ), представляющий новый SHA1 подмодуля gh-pages.

cd myrepo/gh-pages
# modify files
git add .
git commit -m "modify gh-pages files"
cd .. # back to myrepo folder
git add gh-pages
git commit -m "record gh-pages new SHA1"
git push

С git 2.7+ вы можете установить:

cd /path/to/main/repo
git config push.recurseSubmodules on-demand

Затем один git push из вашего основного репо также переместит подмодуль gh-pages в ветку gh-pages.

Позже один git clone будет клонировать как ваш основной репозиторий и его ветку gh-pages (в папке подмодуля gh-pages).

Таким образом, у вас всегда будет виден оба контента.

И вам не нужен сложный механизм «синхронизация/копирование».


Обновление за август 2016 г.: упрощенная публикация страниц GitHub теперь позволяет хранить файлы подкачки в подпапке той же ветки (больше не нужно gh-pages):

Теперь вы можете выбрать источник в настройках репозитория, и GitHub Pages будет искать там ваш контент.

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

10.02.2016
  • Примечание: это старый подход, о котором я упоминал еще в 2011 году (stackoverflow.com/a/8148319/6309), основанный на Ответ Mark Longair (stackoverflow.com/a/5296433/6309). Но в то время подмодули не следовали за ветвями, и вы не могли отправить все за один раз. 10.02.2016
  • Вы потеряли меня здесь: всякий раз, когда вы вносите изменения в папку gh-pages, не забудьте зафиксировать там. Если я запускаю ваш код в оболочке, он работает, но если я пытаюсь выполнить обычную фиксацию любого рода с помощью Git для Windows (рабочий стол), я получаю сообщение об ошибке, говорящее о добавлении подмодели с оболочкой или удалении файла .git. 11.02.2016
  • Я пробовал этот ответ, но не играл в кости: stackoverflow.com/questions/5542910/ 11.02.2016
  • @Blizzardengle Я подробно описал, что не забудьте совершить этот шаг. И я добавил коммит, который вы должны сделать после первоначального submodule add. Снова клонируйте репозиторий и повторите эти шаги. (только в командной строке. GitHub Desktop — это графический интерфейс, который обертывает и запутывает то, что происходит на самом деле: он вам не нужен) 11.02.2016
  • Я не спал всю ночь, пытаясь изменить это, и могу сказать только две вещи. 1) Работает, спасибо. 2) Это не отвечает на мой ОП, где я просил решение без оболочки. Моя цель и горячее желание — каждый раз использовать графический интерфейс Gits, а не оболочку. Я сделал хук перед фиксацией и даже хук перед отправкой, чтобы автоматически фиксировать изменения подмодуля до того, как мой графический интерфейс зафиксирует, и без игры в кости. Но опять же, если я сделал это вручную в оболочке, это сработало... не понравилось, но работает. 11.02.2016
  • Он будет работать с любым графическим интерфейсом Windows, использующим последнюю версию 2.7.1 git. Он будет работать с GitHub Desktop, когда этот графический интерфейс в конечном итоге будет использовать встроенный в него достаточно свежий git (как я хорошо знаю, вы не можете изменить его версию git: stackoverflow.com/a/33703716/6309). Используйте командную строку: вы можете написать сценарий и сделать все кнопки процесса. 11.02.2016
  • Я неохотно пользуюсь командной строкой. Я знаю, что это всегда лучше всего использовать, спасибо за ваш ответ. Я думаю, что это лучшая настройка автопроекта для веб-сайта, которую я когда-либо видел. 11.02.2016
  • @Blizzardengle Опять же, если у вас есть графический интерфейс, который вызывает достаточно недавний git (например, Tortoise Git, SmartTree, ...), вся командная строка, которая вам нужна, это начальная git submodule add и git config push.recurseSubmodules on-demand. Все остальное можно сделать из графического интерфейса. Однако не из GitHub Desktop. 11.02.2016

  • 2

    В чем проблема со скриптом ловушки, который вы написали? Каким было содержимое ветки gh-pages, когда вы ее создавали?

    Я создал пустую ветку gh-pages с помощью следующей команды:

    git checkout --orphan gh-pages
    git rm -rf .
    touch README.txt
    git add README.txt
    git commit -m "Initial commit"
    git push -u origin gh-pages
    

    Затем я запустил приведенный ниже скрипт как часть хука после получения, и это сработало для меня.

    #!/bin/bash
    branch=`git rev-parse --abbrev-ref HEAD` 
    if [ "master" == "$branch" ]; then
        git fetch && git checkout gh-pages
        git checkout master -- gh-pages
        git add -A
        git commit -m "Updating project website from 'master' branch."
        git push -u origin gh-pages
    fi
    done
    
    09.02.2016
  • Я не понимаю ваш код, поэтому я думаю, что вы, возможно, неправильно поняли. По какой-то причине мой хук не запускается, но если я запускаю все это сам в оболочке, это вроде как работает. Все, что он сделал, это скопировал каждый измененный файл из всей моей главной ветки в gh-pages, что мне не нужно. github.com/blizzardengle/barebones-framework 09.02.2016
  • Я отредактировал свой вопрос, чтобы указать на часть, которая не работает. 09.02.2016
  • Это никогда не работало как есть, потому что branch=git rev-parse --abbrev-ref HEAD должен быть $(git rev-parse --abbrev-ref HEAD). Он также скопировал больше, чем предполагалось, а именно каталог gh-pages. Это быстрое решение, и его можно рассматривать как ответ, но ответ @VonC больше попадает в самую точку. 11.02.2016
  • мы бы сделали оболочку для выполнения ожидаемой задачи, как я предложил вчера. Однако я согласен, что ответ VonC заслуживает внимания. 11.02.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..