web-dev-qa-db-fra.com

Comment puis-je écrire un fichier de commandes qui ouvre le shell GitBash et exécute une commande dans le shell?

Je suis sous Windows 7 en train d’essayer d’utiliser un fichier de commandes pour ouvrir le shell GitBash et effectuer un appel git . Voici le contenu de mon fichier de commandes:

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

J'ai remarqué que GitBash se déconnecte avant la prochaine commande "git archive ...". Est-ce que quelqu'un sait si je peux passer la commande dans GitBash et comment?

Mike

35
mariachimike
"C:\Program Files (x86)\Git\bin\sh.exe" --login -i -c "git archive master | tar -x -C $0" "%~1"
47
Erik

Vous pouvez également exécuter un script Shell pour exécuter plusieurs commandes.

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

puis appelez ça depuis votre ligne de commande:

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

Dans Windows, j'ai créé un fichier git.bat et je l'ai associé à l'extension .hook.

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

Après cela, vous pouvez exécuter les fichiers .hook comme tous les fichiers .bat ou .cmd, sauf qu'ils fonctionnent sous git Shell ...

5
inf3rno

Utiliser Bash est plus convivial, par exemple

# 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;

Vous pouvez exécuter le script:

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

': ¬), joyeux script!

1
fitorec

Après beaucoup d'essais, celui-ci a fonctionné. Avec la version actuelle de Git For Windows Portable. Ouvrez une fenêtre de commande Windows et exécutez ce script. S'il y a une modification dans votre répertoire de travail, un terminal bash sera ouvert dans votre répertoire de travail et affichera l'état actuel de git. La fenêtre bash reste ouverte en appelant exec bash.

Si vous avez plusieurs projets, vous pouvez créer des copies de ce script avec un dossier de projet différent et l'appeler à partir d'un script de traitement par lots principal. 

Mettre à jour - vérifie les nouveaux fichiers ajoutés, c’est-à-dire les fichiers non suivis. 

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

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
1
RuntimeException

Dans mon cas, une certaine requête HTTP fonctionnerait en boucle dans Git Bash sous Windows. Cependant, je recevrais une erreur de réinitialisation de la connexion lors de l’exécution de Java avec HttpClient et HttpGet (org.Apache.http.client.methods.HttpGet).

Si j'essayais d'utiliser exec pour exécuter directement la commande, cela ne fonctionnerait pas pour une raison quelconque.

Pour résoudre ce problème, ce code écrira la commande dans un fichier de commandes, puis exécutera le fichier de commandes et placera la sortie dans command.txt.

Voici la commande qui doit figurer dans le fichier command.bat (j'ai changé le noeud final et le mot de passe):

"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"

Voici le code (notez que des caractères spéciaux ont été échappés dans la commande):

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();
    }
}
0
Scott Izu