2016-01-01 2 views
2

Я пытаюсь создать сценарий, который упростит некоторые общие задачи с Git. Среди прочего, сценарий должен иметь возможность определять имя текущей ветви. Это отлично работает, если пользователь уже что-то внес в репозиторий, но я не могу понять, как это сделать, если пользователь еще ничего не добавил. Например, в пустой папке:Как определить название ветки до первоначальной фиксации?

git init 
git checkout -b work 

Теперь я хотел бы, чтобы определить имя текущей ветви: (Так что ожидаемый результат будет work)

git branch 

не дает никакого вывода. Принимая во внимание:

git checkout work 

дает

error: pathspec 'work' did not match any file(s) known to git. 

и

git rev-parse --abbrev-ref HEAD 

дает выход:

HEAD 
fatal: ambiguous argument 'HEAD': unknown revision or path not in the  
working tree. 
Use '--' to separate paths from revisions, like this: 
'git <command> [<revision>...] -- [<file>...]' 

Однако

cat .git/HEAD 

дает мне:

ref: refs/heads/work 

, но это, кажется, немного, как взломать (выглядывает в отдельный каталог .git). Есть ли какой-либо переносной способ определения имени ветки, когда пользователь ничего не совершил?

ответ

3

Поддерживаемая команда, которая сообщает вам то же самое, что и cat .git/HEAD: git symbolic-ref HEAD. Внутри вновь созданного репозитория без каких-либо коммитов он все равно будет печатать refs/heads/master.

+3

Отлично!Вы также можете получить точное название ветки, указав опцию '--short'. –

1

Это потому, что вы еще ничего не совершили. Обратите внимание, что пока нет master. В ветвях git есть только указатели на фиксации, поэтому без фиксации их не существует. Как только вы что-то совершите (README или LICENSE - это хорошее место для начала), вы сможете увидеть свою ветку.

Причина, по которой .git/HEAD выводит то, что вы ожидаете, состоит в том, что это символическая ссылка, указывающая на ветвь, даже если эта ветка не существует. Это обетованная часть создания новой сиротской ветви (сиротская ветка - это любая ветвь, созданная без ранее существовавшего фиксации, поэтому все ветви, созданные между git init и git commit, являются дочерними сиротами): Любой git commit работает, пока ветка не существует создаваться на ветке, на которую ссылается .git/HEAD, создавая эту ветку, если она еще не существует.

Если вы хотите, чтобы определить, на что указывает .git/HEAD, не работает cat .git/HEAD вы можете использовать команду git symbolic-ref HEAD. Если вам просто нужно имя фактического филиала, вы можете передать флаг --short: git symbolic-ref HEAD --short.

+0

Хорошо, но пользователь создал ветку с 'git checkout -b work', поэтому цель по-прежнему заключается в том, чтобы определить название ветки. Вы говорите, что нет никакой команды git, чтобы определить это имя, когда Пользователь еще ничего не совершал? –

Смежные вопросы