Загрузите определенный тег с помощью Git
Я пытаюсь выяснить, как я могу загрузить определенный тег из репозитория Git - это одна версия позади текущей версии.
На веб-странице git я увидел тег для предыдущей версии, в котором имя объекта было длинным шестнадцатеричным числом.
Но название версииTagged release 1.1.5
по данным сайта.
Я попробовал команду как это (с измененными именами):
git clone http://git.abc.net/git/abc.git my_abc
И я кое-что получил - каталог, куча подкаталогов и т. Д.
Если это весь репозиторий, как мне найти нужную версию? Если нет, как я могу скачать эту конкретную версию?
17 ответов
$ git clone
даст вам весь репозиторий.
После клона вы можете перечислить теги с $ git tag -l
а затем оформить заказ на конкретный тег:
$ git checkout tags/<tag_name>
Более того, извлеките и создайте ветку (в противном случае вы попадете на ветку, названную в честь номера версии тега):
$ git checkout tags/<tag_name> -b <branch_name>
git clone --branch my_abc http://git.abc.net/git/abc.git
Клонируем репо и оставим вас на интересующем вас теге.
Документация для 1.8.0 состояний git clone.
--branch также может принимать теги и отсоединять HEAD при этом коммите в результирующем репозитории.
Для проверки только данного тега для развертывания я использую, например:
git clone -b 'v2.0' --single-branch --depth 1 https://github.com/git/git.git
Это кажется самым быстрым способом извлечения кода из удаленного репозитория, если его интересует только самый последний код, а не полный репозиторий. Таким образом, это напоминает команду 'svn co'.
Я не эксперт по git, но я думаю, что это должно работать:
git clone http://git.abc.net/git/abc.git
cd abc
git checkout my_abc
ИЛИ ЖЕ
git clone http://git.abc.net/git/abc.git
cd abc
git checkout -b new_branch my_abc
Второй вариант устанавливает новую ветвь на основе тега, что позволяет вам избежать "отсоединенного HEAD". (руководство по git-checkout)
Каждый репозиторий git содержит всю историю ревизий, поэтому клонирование репозитория дает вам доступ к последнему коммиту, а также ко всему, что было до этого, включая тег, который вы ищете.
Вы можете использовать архив git для загрузки tar-шара для данного тега или идентификатора коммита:
git archive --format=tar --remote=[hostname]:[path to repo] [tag name] > tagged_version.tar
Вы также можете экспортировать zip-архив тега.
Список тегов:
git tag 0.0.1 0.1.0
Экспорт тега:
git archive -o /tmp/my-repo-0.1.0.zip --prefix=my-repo-0.1.0/ 0.1.0
Заметки:
- Вам не нужно указывать формат. Он будет выбран по имени выходного файла.
- Указание префикса приведет к экспорту вашего кода в каталог (если вы добавите косую черту).
Использовать --single-branch
переключатель (доступен с Git 1.7.10). Синтаксис:
git clone -b <tag_name> --single-branch <repo_url> [<dest_dir>]
Например:
git clone -b 'v1.9.5' --single-branch https://github.com/git/git.git git-1.9.5
Преимущество: Git будет получать объекты и (нужно) разрешать дельты только для указанной ветви / тега - при проверке одинакового количества файлов! В зависимости от исходного хранилища это сэкономит вам много места на диске. (Плюс, это будет намного быстрее.)
Сначала получить все теги в этом конкретном пульте
git fetch <remote> 'refs/tags/*:refs/tags/*'
или просто введите
git fetch <remote>
Затем проверьте наличие тегов
git tag -l
затем переключитесь на этот конкретный тег, используя команду ниже
git checkout tags/<tag_name>
Надеюсь, это поможет вам!
Если ваши теги сортируются с помощью Linux sort
команда, используйте это:
git tag | sort -n | tail -1
например. если git tag
возвращает:
v1.0.1
v1.0.2
v1.0.5
v1.0.4
git tag | sort -n | tail -1
будет выводить:
v1.0.5
git tag | sort -n | tail -2 | head -1
будет выводить:
v1.0.4
(потому что вы попросили второй самый последний тег)
чтобы оформить заказ, сначала клонируйте репозиторий, затем введите:
git checkout v1.0.4
... или любой тег, который вам нужен.
git fetch <gitserver> <remotetag>:<localtag>
===================================
Я только что сделал это. Сначала я убедился, что знаю правописание имени тега.
git ls-remote --tags gitserver; : or origin, whatever your remote is called
Это дало мне список тегов на моем git-сервере на выбор. Оригинальный постер уже знал имя своего тега, поэтому этот шаг не является обязательным для всех. Вывод выглядел так, хотя реальный список был длиннее.
8acb6864d10caa9baf25cc1e4857371efb01f7cd refs/tags/v5.2.2.2
f4ba9d79e3d760f1990c2117187b5010e92e1ea2 refs/tags/v5.2.3.1
8dd05466201b51fcaf4ca85897347d82fcb29518 refs/tags/Fix_109
9b5087090d9077c10ba22d99d5ce90d8a45c50a3 refs/tags/Fix_110
Я выбрал метку, которую хотел, и получил ее, и ничего более следующего.
git fetch gitserver Fix_110
Затем я отметил это на своем локальном компьютере, присвоив этому тегу то же имя.
git tag Fix_110 FETCH_HEAD
Я не хотел клонировать удаленный репозиторий, как предлагали другие люди, так как проект, над которым я работаю, большой, и я хочу развиваться в хорошей чистой среде. Я чувствую, что это ближе к первоначальным вопросам "Я пытаюсь выяснить, как загрузить A PARTICULAR TAG", чем к решению, которое предполагает клонирование всего хранилища. Я не понимаю, почему кому-то нужна копия исходного кода Windows NT и Windows 8.1, если они хотят посмотреть исходный код DOS 0.1 (например).
Я также не хотел использовать CHECKOUT, как предлагали другие. Я проверил ветку и не хотел на это влиять. Мое намерение состояло в том, чтобы получить программное обеспечение, которое я хотел, чтобы я мог что-то выбрать и добавить это в свою разработку.
Вероятно, есть способ получить сам тег, а не просто копию коммита, который был помечен. Мне пришлось пометить извлеченный коммит сам. РЕДАКТИРОВАТЬ: Ах да, я нашел это сейчас.
git fetch gitserver Fix_110:Fix_110
Там, где вы видите двоеточие, это remote-name: local-name, а здесь это имена тегов. Это выполняется без нарушения рабочего дерева и т. Д. Просто кажется, что вы копируете данные с удаленного на локальный компьютер, чтобы у вас была собственная копия.
git fetch gitserver --dry-run Fix_110:Fix_110
с добавленной опцией --dry-run вы сможете посмотреть, что будет делать команда, если вы хотите проверить, что вы хотите. Так что я думаю, простой
git fetch gitserver remotetag:localtag
это реальный ответ.
знак равно
Отдельное примечание о тегах... Когда я запускаю что-то новое, я обычно отмечаю пустой репозиторий после git init, так как
git rebase -i XXXXX
требует фиксации, и возникает вопрос: "Как вы перебазируете изменения, которые включают ваше первое изменение программного обеспечения?" Поэтому, когда я начинаю работать, я делаю
git init
touch .gitignore
[then add it and commit it, and finally]
git tag EMPTY
т.е. создать коммит до моего первого реального изменения, а затем использовать позже
git rebase -i EMPTY
если я хочу перебазировать всю свою работу, включая первое изменение.
Я проверил документацию Git Checkout, она обнаружила одну интересную вещь:
git checkout -b
, где - это имя коммита, с которого начинается новая ветка; По умолчанию HEAD
Таким образом, мы можем упомянуть имя тега (так как тег - это не что иное, как имя коммита), например:
>> git checkout -b 1.0.2_branch 1.0.2
позже измените некоторые файлы
>> git push --tags
PS: В Git вы не можете напрямую обновить тег (так как тег - это просто метка для коммита), вам нужно извлечь тот же тег в виде ветви, а затем зафиксировать его, а затем создать отдельный тег.
Отрабатывая ответ Питера Джонсона, я создал для себя симпатичный маленький псевдоним:
alias gcolt="git checkout \`git tag | sort -V | tail -1\`"
ака 'Git Checkout последний тег'.
Это зависит от GNU-версии sort, которая соответствующим образом обрабатывает ситуации, подобные той, на которую указал lOranger:
v1.0.1
...
v1.0.9
v1.0.10
Если вы на Mac, brew install coreutils
и вместо этого вызовите gsort.
Пытаться:
git clone -b <name_of_the_tag> <repository_url> <destination>
Если вы хотите просмотреть версии файлов, на которые указывает тег, вы можете выполнить git checkout, хотя это переводит ваш репозиторий в состояние "detached HEAD", что имеет некоторые неприятные побочные эффекты:
$ git checkout 2.0.0
Note: checking out '2.0.0'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
HEAD is now at 99ada87... Merge pull request #89 from schacon/appendix-final
$ git checkout 2.0-beta-0.1
Previous HEAD position was 99ada87... Merge pull request #89 from schacon/appendix-final
HEAD is now at df3f601... add atlas.json and cover image
В состоянии "отсоединенный HEAD", если вы вносите изменения, а затем создаете коммит, тег останется прежним, но ваш новый коммит не будет принадлежать какой-либо ветви и будет недоступен, за исключением точного хэша коммита. Таким образом, если вам нужно внести изменения - скажем, вы исправляете ошибку в старой версии - вы, как правило, захотите создать ветку:
$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'
Если вы сделаете это и сделаете коммит, ваша ветка version2 будет немного отличаться от вашего тега v2.0.0, поскольку она будет продвигаться вперед с вашими новыми изменениями, поэтому будьте осторожны.
Я делаю это через API GitHub:
curl -H "Authorization: token %(access_token)s" -sL -o /tmp/repo.tar.gz "http://api.github.com/repos/%(organisation)s/%(repo)s/tarball/%(tag)s" ;\
tar xfz /tmp/repo.tar.gz -C /tmp/repo --strip-components=1 ; \
Я часто использовал один
git clone --branch <tag_name> <repo_url>
Я сделал как показано ниже
git checkout tags/20210511 -b 20210511-release
Клон с опцией -b также помогает: git clone https://git01.codeplex.com/aspnetwebstack.git -b v2.0
В следующем сообщении для загрузки asv.net mvc используется указанная выше опция: http://vijayt.com/Post/Setting-up-aspnet-mvc-for-debugging-in-your-system