如何编写打开GitBash shell并在shell中运行命令的批处理文件?

时间:2011-03-05 12:10:58

标签: git shell msysgit windows-shell

我在Windows 7上尝试使用批处理文件打开GitBash shell并进行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以及如何?

麦克

6 个答案:

答案 0 :(得分:48)

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

答案 1 :(得分:11)

您还可以运行shell脚本来运行多个命令

#! /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"

答案 2 :(得分:5)

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

之后你可以像每个.bat或.cmd文件一样运行.hook文件,除了它们在git shell下运行...

答案 3 :(得分:1)

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

':¬),快乐的脚本!

答案 4 :(得分:1)

经过大量的试验,我得到了这个。随着当前版本的Git For Windows Portable。打开Windows命令窗口,然后执行此脚本。如果您的工作目录发生更改,它将在您的工作目录中打开一个bash终端,并显示当前的git状态。它通过调用exec bash来打开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

答案 5 :(得分:0)

在我的情况下,某个HTTP请求可以在Windows上的Git Bash中卷曲。但是,在使用HttpClient和HttpGet(org.apache.http.client.methods.HttpGet)在Java上运行时,我会收到连接重置错误。

如果我尝试使用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();
    }
}