Este trecho de código funciona na maioria dos Unix aos quais eu tenho acesso (Linux, Solaris, AIX), bem como no Windows 7 / Server 2008 R2 e superior que eu usei para obter a saída do git log:
from subprocess import Popen, PIPE
import platform
cmd = ["git", "--no-pager"]
if platform.system() == "Windows":
cmd.append("--work-tree=/path/to/working/copy")
cmd.extend(["log", "--pretty=format:"%cd %h"", "--date=short", "--", "/path/to/working/copy/filename/to/check"])
proc = Popen(cmd, stdout=PIPE, stderr=PIPE)
proc.wait()
f = proc.stdout
some_stuff = f.read()
f.close()
No entanto, no Windows XP usando msysgit eu não estou recebendo qualquer valor para a variável some_stuff, o que é estranho desde que executar o comando gerado funciona na linha de comando no Windows.
Alguma dica sobre o que devo fazer aqui?
Respostas:
0 para resposta № 1Depois de fazer algumas pesquisas, aqui está o que eu encontrei:
- No Windows, o msysgit recomenda o uso do script wrapper
git.cmd
em vez de especificar diretamentegit.exe
. - msysgit é especialmente sensível a nomes de arquivos de caminhos normalizados, em particular a letra da unidade deve estar em letras maiúsculas e que o caso dos nomes de arquivos deve GetLongPathName seria a saída.
- Usando barras, bem como barras invertidas, parece que os separadores de caminho ainda funcionam.
Ao testar o acima mencionado, parece que:
- Não há realmente necessidade de especificar o
--work-tree
opção mais - "Normalizando" nomes de caminhos passando-os para
os.path.normpath()
não funcionará, pois ele assumirá a falta de maiúsculas e minúsculas e alterará a letra da unidade para minúscula. - Usando o caminho curto (a saída de GetShortPathName) não funciona.