Авария из-за нестандартного нейминга (исходник лотереи в конце статьи)

задняя часть Git

Эта статья подала заявку на периферийные подарки Nuggets - два значка Nuggets для лотереи в области комментариев. Участвуйте, комментируяПодробности

написать впереди

Вот в чем дело.Сегодня утром я увидел, что Gitlab компании имеет эту спецификацию для именования тегов:

Не может иметь то же имя, что и существующая ветвь этого проекта.

Движимый любопытством, я нажал на предысторию истории.

Основной процесс повторяться не будет. В общем, порядок вещей примерно такой:

  • Проблема: Когда тестовая среда создает код выпуска, новая логика никогда не вступает в силу.
  • Анализ: код, полученный от мастера с использованием веб-страниц Gitlab, API и т. д., не является последним кодом.
  • Причина: Разработчик создал тег с именем master на узле, который когда-то был подключен к сети; по умолчанию выбрана работа веб-страниц и API на основе мастера.tag masterвместо того, что мы ожидалиbranch master .
  • Результат: добавлен Gitlab Server Hook для имен тегов ограничений. Запрещено называть тег master, а также запрещается иметь то же имя, что и ветка.

Главное сказано трижды:

Имя ветки (Branch) и имя тега (Tag) не могут совпадать

Имя ветки (Branch) и имя тега (Tag) не могут совпадать

Имя ветки (Branch) и имя тега (Tag) не могут совпадать

некоторые документы

анализ проблемы

Вышеуказанные проблемы на самом деле очень легко возникают в процессе разработки. Хотя есть предложения и ограничения, ни одна из непристойных операций, которые следует предпринять, не будет отменена. Давайте объединим демо, чтобы посмотреть, что получилось?

демонстрация нативного кода

Попробуйте локально создать тег и ветку с таким же именем. Следующий код показывает, что при переключении ветвей будет появляться предупреждение. Имя индекса подсказки неоднозначно.

~/github/demo on  master ⌚ 18:30:42
$ git tag master

~/github/demo on  master ⌚ 18:30:48
$ git checkout master
warning: refname 'master' is ambiguous.
Already on 'master'

Тогда переключателем по умолчанию локальной команды git является имя ветки, как переключиться на соответствующее имя тега? Конкретный тип индекса можно указать следующим образом, а также можно указать переключение на конкретную ветвь/тег.

# 切换到指定的 tag
git checkout refs/tags/master

# 切换到指定的 branch
git checkout refs/heads/master

Как удалить ветку/тег с тем же именем, вы можете использовать полное имя ветки/тега.

git branch -D refs/heads/dev
git tag -d refs/tags/dev

Резюме: вы можете увидеть локальное предупреждение, когда команда checkout встречает тег ветки с таким же именем, и по умолчанию она переключается на ветку. Если вы хотите переключиться на тег, вы можете достичь цели, указав тип переключателя.

Здесь легко могут возникнуть два вопроса:

  • Разница между Branch и Tag, почему должно быть различие?

  • В случае того же имени ветки/тега, будет ли Checkout переключаться на тег по умолчанию?

Разница между веткой и тегом

Проверьте StackOverflow для обсуждения этого удобства. How is a tag different from a branch in Git

A: Проще говоря, есть два отличия:

  • Характеристикой ветки является то, что положение указателя ветки постоянно обновляется при представлении, которое обычно хранится вrefs/heads/.
  • Характеристики тегов противоположны ветвям, и коммиты, на которые они указывают, не будут обновляться новыми коммитами. Обычно хранится вrefs/tags/.

Цитирование примера из StackOverflow для объяснения:

image.png

Концепция ветки (Branch) очень похожа на закладку, используемую при чтении, которая фиксирует последнюю позицию нашего момента чтения в режиме реального времени. А тег (Tag) — это как заметка, которую мы вклеиваем в книгу, по которой нам удобно возвращаться на определенную страницу.

Приоритет оформления заказа

Используйте, когда ветка и тег имеют одно и то же имяgit checkout somethingПочему вы предпочитаете тег?

В документации Git Checkoutgit-triplegate.com/docs/git-eat…Обратите внимание, что у Checkout есть два основных применения: одно — отбрасывание некоторых зафиксированных файлов, а другое — переключение местоположения git-индекса. Если есть ветка с тем же именем, что и у тега, переключиться на ветку по умолчанию и выдать предупреждение.

Создайте тег с именем commitId

Что, если я создам ветку/тег с идентификатором коммита в качестве имени?

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

Резюме мыслей

Когда возникают проблемы такого рода, наша ежедневная привычка думать, что master должен быть веткой по умолчанию. Однако при игнорировании развертывания GitLab CI имя тега может быть предпочтительнее в качестве имени развертывания.

Ниже приводится обсуждение Gitlab CI, когда ветка тега имеет такое же имя.Branch and tag with same name cause multiple problemsВот подробное объяснение проблем, которые могут возникнуть, если ветка/тег Gitlab имеет такое же имя.

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

  • И имена ветвей, и имена тегов должны избегать конфликтов.
  • Должен быть стандарт при именовании ветвей/тегов, и вы должны знать имя (это должно быть знакомо студентам, которые пишут код).
  • Обязательно обратите внимание на Предупреждения, иногда устранение Предупреждения устраняет ошибку.
  • Адекватное использование инструментов для вмешательства в некоторые предсказуемые действия. Например, git hook проверяет отправленную информацию.

Розыгрыши

Правила розыгрыша данного события следующие:

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

Все комментарии должны соответствовать нормам сообщества Nuggets. В противном случае вы не сможете принять участие в мероприятии.

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

Если с победителем невозможно связаться, он будет разыгран повторно.

Розыгрыш будет объявлен 12 сентября.

реализация лотерейного кода

Этот розыгрыш лотереи основан на принципе честности и справедливости, поэтому код лотереи JS размещен здесь. Пожалуйста, исправьте свои ошибки.Для подробной логики вы можете просмотреть код ниже.

логика лотерейного кода

    1. Вызовите интерфейс комментариев к статьям Nuggets, чтобы получить всех пользователей, комментирующих
    1. Math.randomРеализовать произвольный доступ к элементам массива
    1. Проведите лотерею и убедитесь, что два выигравших пользователя разные
    1. Консольный вывод пользователей-победителей

как пользоваться

Откройте консоль Chrome и скопируйте и вставьте следующий код. Пользователь, выведенный из консоли, является пользователем-победителем.

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

function choose(choices) {
    var index = Math.floor(Math.random() * choices.length);
    return choices[index];
  }

async function getUserApi(cursor) {

    data = {
        "item_id": "7005444889106186270",
        "item_type": 2,
        "cursor": cursor.toString(),
        "limit": 20,
        "sort": 0,
        "client_type": 2608
    }
    
    obj = await fetch('https://api.juejin.cn/interact_api/v1/comment/list', {
          method: 'POST', body: JSON.stringify(data),
          credentials: "include",
          headers: {
            'Content-type': 'application/json; charset=UTF-8'
          }
        })
        .then(res => {
            obj = res.json()
            return obj
        
        })
    return obj
}
  
async function getAllCommentInfo() {
    cursor = 0
    has_more = true
    result = []
    while (has_more) {
        response = await getUserApi(cursor)
        cursor = response['cursor']
        has_more = response['has_more']
        data = response['data']
        result = [...result, ...data]
    }
    return result
}
  
async function lottery() {
    commentInfo = await getAllCommentInfo()
    userInfo = commentInfo.map(item => item.user_info.user_id + "-" + item.user_info.user_name)

    userInfoDistinct = Array.from(new Set(userInfo))
    user1 = choose(userInfoDistinct)
    user2 = choose(userInfoDistinct)
    
    while (user1 == user2) {
        user2 = choose(userInfoDistinct)
    }

    console.log("抽奖时间为:" + new Date())
    console.log("去重评论数:" + userInfoDistinct.length)
    console.log("恭喜您中奖了 " + user1)
    console.log("恭喜您中奖了 " + user2)
}

lottery()