Как написать пакетный файл, который открывает оболочку GitBash и запускает команду в оболочке?

Я в Windows 7 пытаюсь использовать пакетный файл, чтобы открыть оболочку GitBash и сделать вызов git. Это содержимое моего пакетного файла:

REM Open GitBash 
C:\Windows\SysWOW64\cmd.exe /c ""C:\Program Files (x86)\Git\bin\sh.exe" --login -i"
REM retrieve archive
git archive master | tar -x -C %~1
REM quit GitBash
exit

Я заметил, что GitBash выходит из системы перед следующей командой «git archive...». Кто-нибудь знает, могу ли я передать команду в GitBash и как?

Майк


person mariachimike    schedule 05.03.2011    source источник


Ответы (6)


Вы также можете запустить сценарий оболочки для запуска нескольких команд.

#! /bin/bash
cd /c/GitRepo/PythonScripts
git status
read -p "Press enter to continue"

затем вызовите это из своей строки cmd:

"c:\Program Files (x86)\Git\bin\sh.exe" --login -i -c "/c/GitRepo/PythonScripts/statusandwait.sh"
person rugg    schedule 18.01.2014

В Windows я создал файл git.bat и связал его с расширением .hook.

if not exist %1 exit
set bash=C:\Program Files (x86)\Git\bin\bash.exe
"%bash%" --login -i -c "exec "%1""

После этого вы можете запускать файлы .hook, как и все файлы .bat или .cmd, за исключением того, что они работают в оболочке git...

person inf3rno    schedule 15.02.2012
comment
Привет @inf3rno, довольно поздний комментарий, но было бы хорошо, если бы вы могли подробнее рассказать о его связи с расширением .hook. Спасибо. - person jumping_monkey; 11.12.2019
comment
@jumping_monkey Просто погуглите ассоциации файлов Windows. - person inf3rno; 12.12.2019
comment
Привет @ inf3rno, я хотел сказать, что твой ответ не должен вести меня к дальнейшему гуглению ;-), В любом случае, спасибо за подсказку. - person jumping_monkey; 13.12.2019

После долгих проб у меня заработало это средство. С текущей версией Git для Windows Portable. Откройте командное окно Windows и выполните этот скрипт. Если в вашем рабочем каталоге есть изменения, он откроет терминал bash в вашем рабочем каталоге и отобразит текущий статус git. Он держит окно bash открытым, вызывая exec bash.

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

Обновить - проверить новые добавленные файлы, т.е. неотслеживаемые файлы.

=============

REM check git status of given folders. 

setlocal EnableDelayedExpansion

set GIT_HOME=D:\eclipse\devtools\PortableGit-2.6.2

set GIT_EXEC=%GIT_HOME%\mingw64\bin\git.exe
set GIT_BASH=%GIT_HOME%\bin\bash.exe

set GITREPO=D:\source\myproject

pushd %GITREPO%
%GIT_EXEC% status
%GIT_EXEC%  diff-index --quiet --cached HEAD
set VAR1=%errorlevel%
if not "%VAR1%"=="0" (
echo.
echo There are changes which are staged i.e. in index - but not committed.
echo.
)
%GIT_EXEC% diff-files --quiet
set VAR2=%errorlevel%
if not "%VAR2%"=="0" (
echo.
echo There are changes in working directory.
echo.
)

rem below for loop requires enabledDelayedExpansion
for /f "delims=" %%i in ('%GIT_EXEC% ls-files --others --exclude-standard') do (
    if "!VAR3!"=="" (set VAR3=%%i) else (set VAR3=!VAR3!#%%i)
)

if not "%VAR1%"=="0" set REQUIRECOMMIT=true
if not "%VAR2%"=="0" set REQUIRECOMMIT=true
if not "%VAR3%"=="" set REQUIRECOMMIT=true

if "%REQUIRECOMMIT%"=="true" (
    start "gitbash" %GIT_BASH% --login -i -c "git status; exec bash"
)

popd

endlocal
person RuntimeException    schedule 27.10.2015
comment
Спасибо Спасибо спасибо! Это поможет мне начать работу немного быстрее. - person Dietrich George; 03.04.2018

Использовать Bash более дружелюбно, например

# file: backup.sh

cd /c/myProyectPath/
PWD=$(pwd);

function welcome() {
   echo "current Dir   : $PWD";
}

function backup() {
   git pull

   #if you have install wamp <http://www.wampserver.com>, we making slqBackup
   MYSQLDUMP="/c/wamp/bin/mysql/mysql5.6.12/bin/mysqldump.exe";
   $MYSQLDUMP --user=login --password=pass --no-create-info bd > data/backup.sql
   git add data/backup.sql;

   #generating tar file
   git archive -o latest.tar HEAD
}

welcome;
backup;

echo "see you";
sleep 30;

Вы можете запустить скрипт:

"C:\Program Files (x86)\Git\bin\sh.exe" --login -i -c "/c/myProyectPath/run.sh"
person fitorec    schedule 07.03.2014

В моем случае определенный HTTP-запрос будет работать в curl в Git Bash в Windows. Однако я получаю ошибку сброса подключения при работе на Java с использованием HttpClient и HttpGet (org.apache.http.client.methods.HttpGet).

Если бы я попытался использовать exec для прямого запуска команды, по какой-то причине это не сработало бы.

В качестве обходного пути этот код запишет команду в пакетный файл, затем запустит пакетный файл и поместит вывод в command.txt.

Вот команда, которая должна быть в файле command.bat (я изменил конечную точку и пароль):

"C:\Users\scottizu\AppData\Local\Programs\Git\bin\sh.exe" --login -i -c "curl 'https://my.server.com/validate/user/scottizu' -H 'Password: MY_PASSWORD' > command.txt"

Вот код (обратите внимание, что в команде экранированы специальные символы):

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;

public class CURL_Runner {
    public static void main (String[] args) throws Exception {
        String command = "\"C:\\Users\\scottizu\\AppData\\Local\\Programs\\Git\\bin\\sh.exe\" --login -i -c \"curl 'https://my.server.com/validate/user/scottizu' -H 'Password: MY_PASSWORD' > command.txt\"";
        createAndExecuteBatchFile(command);
    }

    public static void createAndExecuteBatchFile(String command) throws Exception {

        // Step 1: Write command in command.bat
        File fileToUpload = new File("C:\\command.bat");
        try {
            if(fileToUpload.getParentFile() != null && !fileToUpload.exists()) {
                fileToUpload.getParentFile().mkdirs();
            }
            FileWriter fw = new FileWriter(fileToUpload);
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write(command);
            bw.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        // Step 2: Execute command.bat
        String[] cmdArray = new String[1];
        cmdArray[0] = "C:\\command.bat";

        Process process = Runtime.getRuntime().exec(cmdArray, null, new File("C:\\"));
        int processComplete = process.waitFor();
    }
}
person Scott Izu    schedule 07.07.2017

person    schedule
comment
На самом деле у меня другая проблема. Я вызываю эту команду из папки /build/ в своем репозитории, поэтому она извлекает только то, что находится в каталоге /build/ в мастере. Есть ли способ указать, что я хочу, чтобы он был заархивирован из родительского каталога? - person mariachimike; 05.03.2011
comment
Мне нужно было вызвать псевдоним из пакетного файла, и я использовал этот ответ, чтобы придумать: C:\Program Files (x86)\Git\bin\bash.exe --login -i -c myaliasname Это сработало отлично! Спасибо! - person cmcculloh; 07.04.2011
comment
Можно ли таким образом вызывать несколько команд? (Я пытаюсь создать исполняемый файл из git-хука с помощью wsh, но он создает новый поток для каждой команды...) - person inf3rno; 15.02.2012
comment
Этот вариант (см. конец комментария) также включает каталог изменения после открытия GIT, потому что у меня есть разные каталоги для работы. Я бы просто использовал cd myDir в пакетном файле, но я использую пути UNC (например, \\server01\myfolder), и они не работают с командой cd в обычной среде Windows cmd.exe. C:\Program Files\Git\git-bash.exe --cd=\\Server01\projects\R_Code -c git commit -m'scheduled commit' - person jNorris; 14.02.2019