programacion - ¿Cómo escribo un archivo por lotes que abre el shell GitBash y ejecuta un comando en el shell?
for en batch (6)
Después de muchas pruebas, conseguí que esta funcionara. Con la versión actual de Git para Windows Portable. Abra una ventana de comandos de Windows y ejecute esta secuencia de comandos. Si hay un cambio en su directorio de trabajo, se abrirá un terminal de bash en su directorio de trabajo, y se mostrará el estado de git actual. Mantiene la ventana de bash abierta, llamando a exec bash
.
Si tiene varios proyectos, puede crear copias de este script con una carpeta de proyecto diferente y llamarlo desde un script de lote principal.
Actualizar: comprueba los nuevos archivos agregados, es decir, los archivos sin seguimiento.
=============
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
Estoy en Windows 7 tratando de usar un archivo por lotes para abrir el shell GitBash y hacer una llamada git. Este es el contenido de mi archivo por lotes:
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
Noté que el GitBash se está desconectando antes del próximo comando "git archive ...". ¿Alguien sabe si puedo pasar el comando a GitBash y cómo?
Micro
En Windows creé un archivo git.bat y lo asocié a la extensión .hook.
if not exist %1 exit
set bash=C:/Program Files (x86)/Git/bin/bash.exe
"%bash%" --login -i -c "exec "%1""
Después de eso, puede ejecutar los archivos .hook como todos los archivos .bat o .cmd, excepto que se ejecutan bajo git shell ...
En mi caso, una determinada solicitud de HTTP funcionaría en curl dentro de Git Bash en Windows. Sin embargo, obtendría un error de restablecimiento de la conexión al ejecutar en Java utilizando HttpClient y HttpGet (org.apache.http.client.methods.HttpGet).
Si traté de usar exec para ejecutar directamente el comando, por alguna razón no funcionaría.
Como solución temporal, este código escribirá el comando en un archivo por lotes, luego ejecutará el archivo por lotes y colocará el resultado en command.txt.
Aquí está el comando que debe estar en el archivo command.bat (he cambiado el punto final y la contraseña):
"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"
Aquí está el código (observe que el comando tiene caracteres especiales escapados):
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();
}
}
También puede ejecutar un script de shell para ejecutar múltiples comandos
#! /bin/bash
cd /c/GitRepo/PythonScripts
git status
read -p "Press enter to continue"
luego llama eso desde tu línea de cmd:
"c:/Program Files (x86)/Git/bin/sh.exe" --login -i -c "/c/GitRepo/PythonScripts/statusandwait.sh"
Usar Bash es más amigable, por ejemplo
# 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;
Puede ejecutar el script:
"C:/Program Files (x86)/Git/bin/sh.exe" --login -i -c "/c/myProyectPath/run.sh"
'': ¬), scripting feliz!
"C:/Program Files (x86)/Git/bin/sh.exe" --login -i -c "git archive master | tar -x -C $0" "%~1"