Git альтернативы "svn info", которые могут быть включены в сборку для отслеживания? - PullRequest
47 голосов
/ 29 мая 2009

Я ищу Git альтернативы "svn info".

Сегодня я добавил некоторую информацию, которую Subversion предоставляет мне с помощью команды "svn info" прямо в мою сборку, и затем она помещается в исходный файл, который печатает это во время запуска. Таким образом, я всегда знаю, откуда взялась эта сборка и как ее вернуть.

Если у вас есть «svn info», такая как URL, корень репозитория, UUID репозитория и ревизия, у вас есть хорошая связь между тем, что развернуто, и системой сборки. И если кто-то сообщает об ошибке, вы знаете, откуда появилось это программное обеспечение, и поскольку эта информация была автоматически включена, риск человеческой ошибки меньше.

Теперь вопрос в том, какую информацию мне нужно получить от Git, чтобы я мог позже определить, откуда появилась эта сборка? И как я могу использовать эту информацию, чтобы вернуться именно к этой версии?

(Может быть, мне нужно добавить информацию о "сборке компьютера", так как Git распространяется.)


Обновление : Использование rev-parse было действительно полезным, и я получил что-то вроде этого:

cj@zap:~/git_test$ git rev-parse HEAD
72ce5f3e13c61f76fde5c58cefc85eed91b6f1f8

И с этим магическим числом позже можно сделать:

cj@zap:~/git_test$ git checkout 72ce5f3e13c61f76fde5c58cefc85eed91b6f1f8

И я вернулся туда, где был.


Update : Я думаю, что если я возьму некоторые части из этих сценариев, предоставленных VonC, и вставлю их в свой сборочный файл, я получу результат, который искал.


Обновление

Примечание к "git description". Для этого вам понадобится реальный тег (tag -a) ранее в истории веток, иначе вы получите что-то вроде этого.

fatal: cannot describe '72ce5f3e13c61f76fde5c58cefc85eed91b6f1f8'

Проблема также описана в Тег Git по умолчанию не так .

Но учтите, что оформление заказа все равно работает, хотя это было сообщение об ошибке.

git checkout 72ce5f3e13c61f76fde5c58cefc85eed91b6f1f8

Хотя обычно кажется, что вы создаете что-то вроде тега "ver1.0", а затем, если вы продолжаете работать, вы получаете что-то вроде этого:

cj@zap:~/git_test$ git describe 
ver1.0-2-g4c7a057
cj@zap:~/git_test$ git tag -a ver2.0
cj@zap:~/git_test$ git describe 
ver2.0
cj@zap:~/git_test$ git commit . -m "something..."
Created commit ac38a9d: something...
 1 files changed, 1 insertions(+), 0 deletions(-)
cj@zap:~/git_test$ git describe 
ver2.0-1-gac38a9d

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

Ответы [ 8 ]

72 голосов
/ 15 мая 2013

Я знаю, что ответ уже принят, но это может помочь кому-то, кто ищет информацию об удаленных и филиалах.

 git remote show origin
27 голосов
/ 29 мая 2009

Чтобы завершить ответ Чарльза, вы также можете создать скрипт, отображающий информацию типа sn info, такую ​​как эта (уже упомянутая там )

#!/bin/bash

# author: Duane Johnson
# email: duane.johnson@gmail.com
# date: 2008 Jun 12
# license: MIT
# 
# Based on discussion at http://kerneltrap.org/mailarchive/git/2007/11/12/406496

pushd . >/dev/null

# Find base of git directory
while [ ! -d .git ] && [ ! `pwd` = "/" ]; do cd ..; done

# Show various information about this git directory
if [ -d .git ]; then
  echo "== Remote URL: `git remote -v`"

  echo "== Remote Branches: "
  git branch -r
  echo

  echo "== Local Branches:"
  git branch
  echo

  echo "== Configuration (.git/config)"
  cat .git/config
  echo

  echo "== Most Recent Commit"
  git log --max-count=1
  echo

  echo "Type 'git log' for more commits, or 'git show' for full commit details."
else
  echo "Not a git repository."
fi

popd >/dev/null

Что даст что-то вроде:

== Remote URL: origin git@github.com:canadaduane/my-project.git
== Remote Branches:
  origin/work
  trunk
  trunk@1309
  trunk@2570
  trunk@8

== Local Branches:
  master
* work

== Configuration (.git/config)
[core]
  repositoryformatversion = 0
  filemode = true
  bare = false
  logallrefupdates = true
[svn-remote "svn"]
  url = svn+ssh://svn.my-project.com/srv/svn
  fetch = my-project/trunk:refs/remotes/trunk
[remote "origin"]
  url = git@github.com:canadaduane/my-project.git
  fetch = refs/heads/*:refs/remotes/origin/*
[github]
  user = canadaduane
  repo = my-project

== Most Recent Commit
commit b47dce8b4102faf1cedc8aa3554cb58d76e0cbc1
Author: Duane Johnson <duane.johnson@gmail.com>
Date:   Wed Jun 11 17:00:33 2008 -0600

    Added changes to database schema that will allow decentralization from content pointers table

type 'git log' for more, or 'git show' for full commit details.
9 голосов
/ 29 мая 2009

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

git rev-parse HEAD

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

git diff --name-status HEAD

или просто используйте код выхода:

git diff --quiet HEAD

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

Если у вас есть центральный главный репозиторий, вы можете записать его URL, хотя, поскольку идентификатор фиксации является уникальным для всех клонов проекта, это не важная информация для идентификации фиксации.

7 голосов
/ 16 июня 2015

Вы можете получить удаленную информацию, как мы получаем в 'svn info':

git remote -v
3 голосов
/ 29 мая 2009
git describe

- это все, что вам нужно. Просто убедитесь, что вы создали хотя бы один (правильный) тег.

2 голосов
/ 30 мая 2009

Я не знаю, хотите ли вы этого, но если вы хотите встроить какую-то информацию о версии во время сборки, пометьте ваши точечные релизы и посмотрите, как это делает сам Git (ядро Linux использует то же самое) механизм), используя Makefile и GIT-VERSION-GEN script (обе ссылки на gitweb на repo.or.cz) .

GIT-VERSION-GEN в свою очередь использует git-description .

0 голосов
/ 18 июня 2019

Вы можете создать псевдоним в git .

git config --global alias.info 'rev-parse HEAD'

Тогда вы можете использовать ту же команду в git,

git info
0 голосов
/ 25 апреля 2017

Вот gitinfo.ps1 (или Get-GitInfo.ps1 для пуристов), версия PowerShell сценария оболочки Дуэйна Джонсона:

# From http://stackoverflow.com/a/924657/990504
# Duane Johnson's script translated to PowerShell by Jonathan Fischer 2015.04.25

Push-Location .

# Find base of git directory
while ( $true )
{
  if ( Test-Path -PathType container .git )
  {
    # Show various information about this git directory
    Write-Output "== Remote URL: $(git remote -v)"

    Write-Output "`n== Remote Branches: "
    git branch -r

    Write-Output "`n== Local Branches:"
    git branch

    Write-Output "`n== Configuration (.git/config)"
    Get-Content .git/config

    Write-Output "`n== Most Recent Commit"
    git log --max-count=1

    Write-Output "Type 'git log' for more commits, or 'git show' for full commit details."
    break
  }

  # Try parent directory.
  Set-Location ..
  # Stop if at root of drive.
  if ( (Get-Location).Path -match "[A-Z]:\\$" )
  {
    Write-Error "Not a Git repository."
    break
  }
}

# Note: even though the popd was not strictly necessary in the bash version
# unless the script was sourced/dotted, PowerShell has the questionable behavior
# where scripts modify the current directory (and environment!) of the calling
# process. So we need the Pop-Location.
Pop-Location
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...