Git Komutlarını Debug Etmek

Git komutlarını çalıştırdığınızda arka planda neler olduğunu merak ettiniz mi? Yada daha önemlisi bir şekilde hata alıp neden çalışmadığını bulmaya uğraştınız oldu mu?

Bunun kolay bir yöntemi var. git herzaman bash shell içinde çalışır ve birçok shell environment variable kullanır. Bunların hepsinden bahsetmiycem detaylarına buradan bakılabilir. Git Internals - Environment Variables

Özellikle networking ve debugging bölümleri benim çok işime yarıyor. En fazla kullandığım ise GIT_TRACE.

Kullanmak için herhangi bir git komutunun önüne aşağıdaki gibi yazmanız yeterli.

GIT_TRACE=1 git pull

Örneğin git pull komutu normalde az output üretirir.

$ git pull
Already up-to-date.

Aynı komutu GIT_TRACE ile çalıştırdığımızda ise birçok işlem yaptığını ve farklı komutlar çalıştırdığını görürüz.

$ GIT_TRACE=1 git pull
trace: exec: 'git-pull'
trace: run_command: 'git-pull'
trace: built-in: git 'rev-parse' '--git-dir'
trace: built-in: git 'rev-parse' '--is-bare-repository'
trace: built-in: git 'rev-parse' '--show-toplevel'
trace: built-in: git 'ls-files' '-u'
trace: built-in: git 'symbolic-ref' '-q' 'HEAD'
trace: built-in: git 'config' '--bool' 'branch.master.rebase'
trace: built-in: git 'config' '--bool' 'pull.rebase'
trace: built-in: git 'rev-parse' '-q' '--verify' 'HEAD'
trace: built-in: git 'fetch' '--update-head-ok'
trace: run_command: 'git-remote-https' 'origin' 'https://github.com/TryGhost/Ghost.git'
trace: run_command: 'rev-list' '--objects' '--stdin' '--not' '--all' '--quiet'
trace: run_command: 'rev-list' '--objects' '--stdin' '--not' '--all'
trace: exec: 'git' 'rev-list' '--objects' '--stdin' '--not' '--all'
trace: built-in: git 'rev-list' '--objects' '--stdin' '--not' '--all'
trace: run_command: 'gc' '--auto'
trace: exec: 'git' 'gc' '--auto'
trace: built-in: git 'gc' '--auto'
trace: built-in: git 'rev-parse' '-q' '--verify' 'HEAD'
trace: built-in: git 'fmt-merge-msg'
trace: built-in: git 'merge' 'Merge branch '\''master'\'' of https://github.com/TryGhost/Ghost' 'HEAD' '7f753acff179e7f6393126b1e45c1c84277b0f1f'
Already up-to-date.

GIT_TRACE iki farklı değer seti ile çalışır.

  • "1", "2" ve "true" değerleri, sonucun stderr'a yazılmasını sağlar
  • / ile başlayan tam dosya adresi ise verilen dosyaya yazılmasını sağlar

GIT_TRACE_PERFORMANCE da performansı ölçmek için faydalı bir environment variable. Tek tek bütün git işlemlerinin ne kadar sürdüğünü logluyor.

git HTTP üzerinden yaptığı network operasyonları için curl kütüphanesini kullanır. GIT_CURL_VERBOSE ile çalıştırdığımız git komutları da aynı curl -v çıktısını gösterir

$ GIT_CURL_VERBOSE=1 git pull
* Couldn't find host github.com in the .netrc file; using defaults
* Adding handle: conn: 0x7f9b79003000
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x7f9b79003000) send_pipe: 1, recv_pipe: 0
* About to connect() to github.com port 443 (#0)
*   Trying 192.30.252.128...
* Connected to github.com (192.30.252.128) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
* Server certificate: github.com
* Server certificate: DigiCert SHA2 Extended Validation Server CA
* Server certificate: DigiCert High Assurance EV Root CA
> GET /TryGhost/Ghost.git/info/refs?service=git-upload-pack HTTP/1.1
User-Agent: git/1.8.3.4 (Apple Git-47)
Host: github.com
Accept: */*
Accept-Encoding: gzip
Pragma: no-cache

< HTTP/1.1 200 OK
* Server GitHub Babel 2.0 is not blacklisted
< Server: GitHub Babel 2.0
< Content-Type: application/x-git-upload-pack-advertisement
< Transfer-Encoding: chunked
< Expires: Fri, 01 Jan 1980 00:00:00 GMT
< Pragma: no-cache
< Cache-Control: no-cache, max-age=0, must-revalidate
< Vary: Accept-Encoding
<
* Connection #0 to host github.com left intact
Already up-to-date.

Environment variables git kullananların kesin olarak gözatması gereken bir referans bilgiler içeriyor. Daha bir çok kullanılacak değer mevcut. İşinize yarayacak bir tane mutlaka vardır.

Alternatif

*nix kullanıcıları için alternatif olarak tam aynı şey olmasa da aşağıdaki yöntem de kullanılabilir.

~/.ssh/config dosyasına asağıdakini yazarsanız en azından ssh seviyesinden log alabilirsiniz.

Host <git-server-hostname>
    LogLevel (QUIET|FATAL|ERROR|INFO|VERBOSE|DEBUG|DEBUG1|DEBUG2|DEBUG3)

Seçtiğiniz LogLevel seviyesine göre output almanız mümkün.