Как мне выполнить несколько команд git в командном файле без завершения после первой команды? - PullRequest
55 голосов
/ 23 марта 2011

Я попытался поместить серию команд GIT, которые я всегда использую постоянно, в качестве командных файлов, чтобы не повторять себя слишком часто. Например, у меня есть этот пакетный файл с именем update_repo_branch.bat для обновления локального репо и синхронизации ветви с удаленной веткой:

@ эхо выключено
if (% 1) == () перейти к концу
if (% 2) == () перейти к концу
кд% 1
git checkout% 2
git fetch origin
git merge oring /% 2
: Конец

Хорошо быть ленивым, но я обнаружил, что , когда команда GIT завершена, кажется, что она отправляет флаг выхода, чтобы завершить все, что выполняется . Следовательно, использование командного файла для их одновременного выполнения просто не работает. Есть идеи как обойти это?

Ответы [ 3 ]

68 голосов
/ 23 марта 2011

Я не уверен, верно ли это для всех пакетов git для Windows, но, по крайней мере, некоторые из них используют сценарий git.cmd в качестве оболочки для реальных исполняемых файлов git (например, git.exe). Поэтому, когда ваш пакетный файл использует команду git, Windows фактически запускает другой пакетный файл.

К сожалению, когда один пакетный файл вызывает другой, по умолчанию он «переходит» к вызванному пакетному файлу и никогда не возвращается (это для совместимости с древними командными процессорами MS-DOS или чем-то еще).

Вы можете решить эту проблему несколькими способами:

  1. вызовите git в ваших пакетных файлах с помощью команды call, чтобы запустить пакетный файл git.cmd и вернуться к вашему:

    call git checkout %2
    call git fetch origin
    rem etc...
    
  2. вызовите git в вашем пакетном файле, явно используя расширение .exe, чтобы вообще избежать пакетного файла git.cmd. Чтобы это работало, вам может потребоваться убедиться, что ваш путь и другие переменные среды установлены так, как ожидает git.exe (похоже, это то, что git.cmd делает в msysgit):

    git.exe checkout %2
    rem etc...
    
3 голосов
/ 23 марта 2011

Как я вижу из вашего примера, вы на самом деле пытаетесь синхронизировать локальную ветку 'branchname' с origin / branchname

Для этого вам не нужно никаких дополнительных сценариев, вы просто должны использовать git pull вместо последовательности git checkout branchname; git fetch origin; git merge origin/branchname

посмотрите документы по отслеживанию веток в git и их преимуществам.

Вообще говоря, если у вас есть макет репо, подобный этому:

git branch -a
...
master
dev1
dev2
remotes/origin/master
remotes/origin/dev1
remotes/origin/dev2

А ваши ветви dev1 и dev2 отслеживают ветви для origin / dev1 и origin / dev2 соответственно, тогда вам просто нужно выполнить в репозитории:

git pull

Эта команда эффективно синхронизирует все ваши локальные ветви отслеживания с удаленными.

подробнее см. Здесь:

Документы Git Pull

Git удаленные ветки и отслеживание веток (Progit book)

3 голосов
/ 23 марта 2011

Предполагая, что вы используете msysGit в качестве клиента Git, вы, возможно, захотите использовать для этого скрипты Bash. Вы можете разместить функцию bash в вашем ~/.bashrc (обычно это ~ C: \ Users \ - см. Здесь ) следующим образом

update_repo_branch() {
    if [ $# != "2" ]; then
        echo "Usage: update_repo_branch REPO BRANCH" 1>&2
        return 1
    fi

    cd $1
    git checkout $2
    git fetch origin
    git merge origin/$2
}

Затем вы можете запустить update_repo_branch myrepo cool-branch из оболочки mysysGit.

Конечно, это не будет доступно из cmd.exe. Вы сможете использовать его только в оболочке msysGit cygwin.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...