После многих испытаний я получил эту работу. С текущей версией 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
SELECT Orders.OrderNumber, LineItems.Quantity, LineItems.Description
FROM Orders
JOIN LineItems
ON LineItems.LineItemGUID =
(
SELECT TOP 1 LineItemGUID
FROM LineItems
WHERE OrderID = Orders.OrderID
)
В SQL Server 2005
и выше можно было просто заменить INNER JOIN
на CROSS APPLY
:
SELECT Orders.OrderNumber, LineItems2.Quantity, LineItems2.Description
FROM Orders
CROSS APPLY
(
SELECT TOP 1 LineItems.Quantity, LineItems.Description
FROM LineItems
WHERE LineItems.OrderID = Orders.OrderID
) LineItems2
Обратите внимание, что TOP 1
без ORDER BY
не является детерминированным: в этом запросе Вы получите по одному строковому элементу на каждый заказ, но не определено, какой из них он будет.
Многократные вызовы запроса могут дать Вам различные строковые элементы для одного и того же порядка, даже если базовый не изменился.
Если Вам нужен детерминистический порядок, то к самому внутреннему запросу следует добавить пункт ORDER BY
.
Вы можете сделать:
SELECT
Orders.OrderNumber,
LineItems.Quantity,
LineItems.Description
FROM
Orders INNER JOIN LineItems
ON Orders.OrderID = LineItems.OrderID
WHERE
LineItems.LineItemID = (
SELECT MIN(LineItemID)
FROM LineItems
WHERE OrderID = Orders.OrderID
)
Это требует индекса (или первичного ключа) на Lineitems.lyitemid
и индекс Lineitems.OrderiD
или Это будет медленно.
Редактировать: Nevermind, Quassnoi имеет лучший ответ.
Для SQL2K, что-то вроде этого:
SELECT
Orders.OrderNumber
, LineItems.Quantity
, LineItems.Description
FROM (
SELECT
Orders.OrderID
, Orders.OrderNumber
, FirstLineItemID = (
SELECT TOP 1 LineItemID
FROM LineItems
WHERE LineItems.OrderID = Orders.OrderID
ORDER BY LineItemID -- or whatever else
)
FROM Orders
) Orders
JOIN LineItems
ON LineItems.OrderID = Orders.OrderID
AND LineItems.LineItemID = Orders.FirstLineItemID