Git root dizinini bir komutta almanın bir yolu var mı?


669

Mercurial, (.hg içeren) kök dizini üzerinden

hg root

Git'de .git dizinini içeren dizini almak için eşdeğer bir şey var mı?


Güzel senaryo Emil. Komut dosyasını çevrimiçi olarak kullanılabilir hale getirdim ve bağımsız değişken olarak bir dosya / dizin ekleme olanağı sağladım. github.com/Dieterbe/git-scripts/commit/…
Dieter_be

Ayrıca meraklı veya arama yapan herkes için bzr rootBazaar'da çok kullanıldı
Kristopher Ives

Lütfen jeetworks.org/node/52 adresindeki Otomatik Tamamlama ile Havuz Köküne Göre 'gcd': Git-Aware 'cd' notuna dikkat edin .
Micha Wiedenmann

1
VonC

1
@MichaWiedenmann: bağlantı öldü.
d33tah

Yanıtlar:


1112

Evet:

git rev-parse --show-toplevel

Git komutunu daha doğrudan çoğaltmak istiyorsanız, bir takma ad oluşturabilirsiniz :

git config --global alias.root 'rev-parse --show-toplevel'

ve şimdi git rootolduğu gibi çalışacak hg root.


Not : Bir altmodülün bu kök dizinini görüntüler altmodülün ve değil ana deposu. Git> = 2.13 veya üstünü kullanıyorsanız, alt modüllerin süper projenin kök dizinini gösterebilmesinin bir yolu vardır . Gitiniz bundan daha eskiyse, diğer cevaba bakınız.


148
Her zaman tanımlıyorum git config --global alias.exec '!exec 'ki böyle şeyler yapabilirim git exec make. Kabuk diğer adları her zaman üst düzey dizinde yürütüldüğünden bu çalışır.
Daniel Brockman

8
İşte hg rootböyle. Teslim alınmış deponuzun üst düzey dizinini yazdırır. Sizi buna geçirmez (ve aslında, geçerli dizinin ve kabuğunuzun tüm kavramının nasıl etkileştiği nedeniyle bunu yapamazdı).
şeye kadir

14
Bu çözümle küçük uyarı - herhangi bir sembolik bağlantıyı takip edecektir. Yani, içindeyseniz ~/my.proj/foo/barve ~/my.projsimgesine bağlanmışsanız ~/src/my.proj, yukarıdaki komut sizi konumuna götürecektir ~/src/my.proj. Bir sorun olabilir, eğer bundan sonra ne yapmak isterseniz ağaç agnostik değilse.
Franci Penov

3
Bunu bir git kancasından nasıl kullanabilirim? Özellikle, birleştirme sonrası kanca yapıyorum ve yerel git repo gerçek kök dizini almanız gerekir.
Derek

12
Bu çözüm (ve bu sayfada denediğim diğerleri) git kancasının içinde çalışmıyor. Daha kesin olmak gerekirse, proje .gitdizininde olduğunuzda çalışmaz .
Dennis

97

manSayfa git-config(altında Alias'ın ) diyor ki:

Takma ad genişletmesinin önüne bir ünlem işareti gelirse, kabuk komutu olarak değerlendirilir. [...] Kabuk komutlarının, geçerli dizinin olması gerekmeyen bir deponun üst düzey dizininden yürütüleceğini unutmayın.

Böylece, UNIX'te şunları yapabilirsiniz:

git config --global --add alias.root '!pwd'

2
Peki, bir "git root" komutunuz varsa, bunu nasıl bir takma ada koyabilirsiniz? Eğer bunu içine koyarsam .zshrcve `alias cg =" cd $ (git root) "tanımlıyorsam, $ () kısmı kaynak zamanında değerlendirilir ve her zaman ~ / dotfiles'a işaret eder, zshrc'm olduğu yerde .
zelk

2
@cormacrelf Kabuk takma adına koymazsınız. Bir kabuk işlevine veya komut dosyasına koyabilirsiniz.
Conrad Meyer

4
@cormacrelf Çift tırnak yerine tek tırnak içine alın, tanım zamanında değil çalışma zamanında genişletilir.
Nisan'da clacke

3
@Mechanicalsnail Gerçekten mi? Peki dışarıdan repo yapmasını beklersiniz?
Alois Mahdal

1
@AloisMahdal aslında benim için bir repo dışında başarısız değil, sadece cwd raporlar.
justinpitts

90

Has --show-toplevelancak son zamanlarda eklenmiş git rev-parseya da neden kimse bunu söz edilir?

Gönderen git rev-parseadam sayfası:

   --show-toplevel
       Show the absolute path of the top-level directory.

1
Bunu işaret ettiğiniz için teşekkürler; sizin yardımınız olmadan, gözden geçirmeyi tahmin etmek benim için zor olurdu git-rev-parse- çünkü adı revizyon spesifikasyonlarını işlemeyle ilgili olduğunu gösteriyor. BTW, şuna git --work-treebenzer bir iş gördüğüme sevinirim git --exec-path[=<path>]: "Eğer yol belirtilmemişse git geçerli ayarı yazdıracaktır"; en azından IMO, böyle bir özelliği aramak mantıklı bir yer olurdu.
imz - Ivan Zakharyaschev

4
Özellikle root = rev-parse --show-toplevelgitconfig'nizde takma ad kullanabilirsiniz.
Mekanik salyangoz

2
başka bir deyişle, yapabilir git config --global alias.root "rev-parse --show-toplevel"ve daha sonra git rootişi yapabilirsiniz
nonopolarity

@RyanTheLeach git rev-parse --show-toplevelbir alt modülde denediğimde çalışır. Git alt modülünün kök dizinini yazdırır. Sizin için ne yazdırıyor?
wisbucky

2
Bu cevabın neden en üstteki cevabı kopyaladığı konusunda kafam karıştı. Üst cevap düzenlenebilir olduğunu dönüşler dışarı --show-cdupetmek --show-top-level(Bu cevap sunuldu sonra) Şubat 2011 yılında.
wisbucky

54

Peki ya " git rev-parse --git-dir"?

F:\prog\git\test\copyMerge\dirWithConflicts>git rev-parse --git-dir
F:/prog/git/test/copyMerge/.git

--git-dirOpsiyon çalışmaları gibi görünüyor.

Gönderen git rev-ayrıştırma manuel sayfa :

--git-dir

    Show $GIT_DIR if defined else show the path to the .git directory.

Bu git setup-shkomut dosyasında çalışırken görebilirsiniz .

Bir alt modül klasöründeyseniz Git> = 2.13 ile şunları kullanın :

git rev-parse --show-superproject-working-tree

Kullanıyorsanız git rev-parse --show-toplevel, Git 2.25+ (Q1 2020) ile olduğundan emin olun .


3
Oh bekleyin, bu yakındı ama gerçek .git dir, git repo tabanı alır. Ayrıca, .git dizini başka bir yerde olabilir, bu yüzden tam olarak aradığım şey bu değildi.
wojo

2
Doğru, şimdi gerçekten ne aradığınızı görüyorum. --show-cdup daha uygundur. İki seçenek arasındaki farkı göstermek için cevabımı bırakıyorum.
VonC

2
Ayrıca, bu komut .gitzaten kök dizinde iseniz için göreceli bir yol veriyor gibi görünüyor . (En azından msysgit için geçerli.)
Blair Holloway

2
+1, bu OP sorusunun ".git dizini başka bir yerde olabilir" ifadesini görmek için eğlendirerek ".git dizinini içeren dizini al?" Sorusunu yanıtlayan tek yanıttır.
FabienAndre

1
Windows üzerinde çalışan ve git alt modüllerini (örneğin c: \ repositories \ myrepo \ .git \ modules \ mysubmodule) kullanırken çözümlenebilir bir sonuç veren tek çözüm budur. Bu, özellikle yeniden kullanılabilir bir komut dosyasında en sağlam çözüm olmasını sağlar.
chriskelly

36

Burada basit bir cevap yazmak için,

git root

işi yapmak için git tuşunu kullanarak

git config --global alias.root "rev-parse --show-toplevel"

ve ardından aşağıdakileri eklemek isteyebilirsiniz ~/.bashrc:

alias cdroot='cd $(git root)'

böylece cdrootdeponuzun en üstüne gitmek için kullanabilirsiniz .


Çok hoş! Sonuçta uygun!
scravy

Harika bir cevap, teşekkürler!
AVarf

26

Zaten üst düzeydeyseniz veya git deposunda cd $(git rev-parse --show-cdup)değilseniz, sizi eve götürecektir (sadece cd). cd ./$(git rev-parse --show-cdup)bunu düzeltmenin bir yoludur.


7
Başka bir seçenek de alıntı şudur: cd "$(git rev-parse --show-cdup)". Bu işe yarar çünkü cd ""sizi geri değil, hiçbir yere götürmez $HOME. Ve yine de boşluklarla bir şeyler çıkarmaları durumunda $ () çağrılarını alıntılamak en iyi uygulamadır (bu durumda bu komutun değil).
ctrueden

Bu yanıt , bir symlink aracılığıyla git repo dizini değiştirseniz bile iyi çalışır . Git repo'nuz bir sembolik bağın altında olduğunda diğer örneklerden bazıları bek'iniz işe yaramaz çünkü git'in kök dizinini bash'a göre çözmezler $PWD. Bu örnek git $PWDyerine ' nin kökünü çözecektir realpath $PWD.
Damien Ó Ceallaigh

16

Geçerli git kök dizininin mutlak yolunu hesaplamak için, bir kabuk komut dosyasında kullanmayı diyelim, şu readlink ve git rev-parse birleşimini kullanın:

gitroot=$(readlink -f ./$(git rev-parse --show-cdup))

git-rev-parse --show-cdupcwd'nizden köke ulaşmak için doğru sayıda ".." s veya kökteyseniz boş dize verir. Ardından, boş dize durumuyla başa çıkmak için "./" başlığını kullanın readlink -fve tam yola çevirmek için kullanın .

git-rootBu tekniği uygulamak için PATH'nizde kabuk komut dosyası olarak da bir komut oluşturabilirsiniz :

cat > ~/bin/git-root << EOF
#!/bin/sh -e
cdup=$(git rev-parse --show-cdup)
exec readlink -f ./$cdup
EOF
chmod 755 ~/bin/git-root

(Yukarıda, git-root oluşturmak ve yürütme bitlerini ayarlamak için bir terminale yapıştırılabilir; gerçek komut dosyası 2, 3 ve 4. satırlardadır.)

Ve sonra git rootmevcut ağacınızın kökünü almak için koşabilirsiniz . Kabuk betiğinde, rev-ayrıştırma başarısız olursa kabuğun çıkmasına neden olmak için "-e" komutunu kullanın, böylece bir git dizininde değilseniz çıkış durumunu ve hata iletisini düzgün bir şekilde alabilirsiniz.


2
Git "root" dizin yolu boşluk içeriyorsa örnekleriniz bozulur. "$(git rev-parse ...)"Gibi kesmek yerine her zaman kullanın ./$(git rev-parse ...).
Mikko Rantalainen

readlink -fBSD'de aynı şekilde çalışmaz. Geçici çözümler için bu SO'ya bakın . Python cevabı muhtemelen hiçbir şey yüklemeden çalışacaktır: python -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' "$(git rev-parse --show-cdup)".
Bluu

16

Diğerlerinin belirttiği gibi, çözümün çekirdeği kullanmaktır git rev-parse --show-cdup. Ancak, ele alınması gereken birkaç önemli durum vardır:

  1. Cwd zaten çalışma ağacının kökü olduğunda, komut boş bir dize verir.
    Aslında boş bir satır oluşturur, ancak komut ikamesi sondaki satır sonunu kaldırır. Nihai sonuç boş bir dizedir.

    Çoğu yanıt, ./boş bir çıktının "./"beslenmeden önce olması için çıktının önceden eklenmesini önerir cd.

  2. GIT_WORK_TREE, cwd'nin üst öğesi olmayan bir konuma ayarlandığında, çıktı mutlak bir yol adı olabilir.

    ./Bu durumda hazırlık yapmak yanlıştır. A ./mutlak bir yola eklenirse, göreli bir yol olur (ve yalnızca cwd sistemin kök dizini ise aynı konuma başvurur).

  3. Çıktıda boşluk olabilir.

    Bu gerçekten sadece ikinci durumda geçerlidir, ancak kolay bir düzeltmeye sahiptir: komut ikamesi (ve değerin sonraki kullanımları) etrafında çift tırnak kullanın.

Diğer cevapların belirttiği gibi, yapabiliriz cd "./$(git rev-parse --show-cdup)", ancak bu ikinci kenar durumunda (ve çift tırnaklardan ayrılırsak üçüncü kenar durumunda) kırılır.

Birçok mermi hareketsiz cd ""olarak kabul edilir, bu yüzden yapabileceğimiz mermiler için cd "$(git rev-parse --show-cdup)"(çift tırnak boş dizeyi birinci kenar durumunda bir argüman olarak korur ve üçüncü kenar durumunda boşlukları korur). POSIX, sonucunun cd ""belirsiz olduğunu söylüyor , bu nedenle bu varsayımı yapmaktan kaçınmak en iyisi olabilir.

Yukarıdaki tüm durumlarda çalışan bir çözüm, bir tür test gerektirir. Açıkça yapıldı, şöyle görünebilir:

cdup="$(git rev-parse --show-cdup)" && test -n "$cdup" && cd "$cdup"

cdİlk kenar kasası için hayır yapılır.

cd .İlk kenar durumu için çalışmak kabul edilebilirse , koşul parametrenin genişletilmesinde yapılabilir:

cdup="$(git rev-parse --show-cdup)" && cd "${cdup:-.}"

Neden sadece yukarıdaki cevapta kullandığınız "git config --global --add alias.root '! Pwd'" ve bir kabuk takma adı gitroot = 'cd git root' kullanmıyorsunuz?
Jason Axelson

1
Bir takma ad kullanmak mümkün olmayabilir, örneğin komut dosyası yazmak istiyorsanız ve özel bir takma ada güvenemezseniz.
blueyed

1
Alt Modüller başka bir köşe kasasıdır.
Ryan The Leach

14

Bu yolu Git'in kendisine doğru besliyorsanız, :/

# this adds the whole working tree from any directory in the repo
git add :/

# and is equal to
git add $(git rev-parse --show-toplevel)

12

Alt modüllerle, kancalarda ve .gitdizinin içinde çalışan kısa çözümler

İşte çoğunun isteyeceği kısa cevap:

r=$(git rev-parse --git-dir) && r=$(cd "$r" && pwd)/ && echo "${r%%/.git/*}"

Bu, git çalışma ağacında ( .gitdizinin içi dahil ) herhangi bir yerde çalışır , ancak havuz dizinlerinin çağrıldığını varsayar .git(varsayılan değerdir). Alt modüller ile, bu en dıştaki deponun köküne gider.

Geçerli alt modülün köküne ulaşmak istiyorsanız:

echo $(r=$(git rev-parse --show-toplevel) && ([[ -n $r ]] && echo "$r" || (cd $(git rev-parse --git-dir)/.. && pwd) ))

Alt modül kökünüzde, altında [alias]bulunan bir komutu kolayca yürütmek için şunu .gitconfigekleyin:

sh = "!f() { root=$(pwd)/ && cd ${root%%/.git/*} && git rev-parse && exec \"$@\"; }; f"

Bu, aşağıdakileri kolayca yapmanızı sağlar: git sh ag <string>

Farklı adlandırılmış veya harici .gitveya $GIT_DIRdizinleri destekleyen sağlam çözüm .

Not $GIT_DIRyerde dış işaret edebilir (ve çağrılacak .gitkez daha gözden dolayısıyla ihtiyaç).

Bunu şuna ekle .bashrc:

# Print the name of the git working tree's root directory
function git_root() {
  local root first_commit
  # git displays its own error if not in a repository
  root=$(git rev-parse --show-toplevel) || return
  if [[ -n $root ]]; then
    echo $root
    return
  elif [[ $(git rev-parse --is-inside-git-dir) = true ]]; then
    # We're inside the .git directory
    # Store the commit id of the first commit to compare later
    # It's possible that $GIT_DIR points somewhere not inside the repo
    first_commit=$(git rev-list --parents HEAD | tail -1) ||
      echo "$0: Can't get initial commit" 2>&1 && false && return
    root=$(git rev-parse --git-dir)/.. &&
      # subshell so we don't change the user's working directory
    ( cd "$root" &&
      if [[ $(git rev-list --parents HEAD | tail -1) = $first_commit ]]; then
        pwd
      else
        echo "$FUNCNAME: git directory is not inside its repository" 2>&1
        false
      fi
    )
  else
    echo "$FUNCNAME: Can't determine repository root" 2>&1
    false
  fi
}

# Change working directory to git repository root
function cd_git_root() {
  local root
  root=$(git_root) || return 1  # git_root will print any errors
  cd "$root"
}

Yazarak bunu yürütün git_root(kabuğun yeniden başlattıktan sonra: exec bash)


Bu kod, git deposunun kökünü bulmak için Sağlam bash işlevinde kod gözden geçiriliyor . Güncellemeler için oraya bakın.
Tom Hale

Güzel. 7 yıl önce önerdiğimden daha karmaşık ( stackoverflow.com/a/958125/6309 ), ama yine de +1
VonC

1
Bu hatlar boyunca daha kısa çözüm: (root=$(git rev-parse --git-dir)/ && cd ${root%%/.git/*} && git rev-parse && pwd)ancak bu, $GIT_DIRaşağıdakiler dışında adlandırılan harici s'yi kapsamaz.git
Tom Hale

Bu, git 2.5+ ( stackoverflow.com/a/30185564/6309 ) ' da artık mümkün olan çoklu çalışma ağaçlarını dikkate alıp almadığımı merak ediyorum
VonC

"Kökü bulmak için sağlam bash işlevi ..." için yorum bağlantınız artık 404 veriyor.
ErikE

8

"Git config" yanıtını biraz değiştirmek için:

git config --global --add alias.root '!pwd -P'

ve yolu temizletir. Çok hoş.


7

Bunu yapmak için iyi bir takma ad arıyorsanız, cdgit dir'de değilseniz havaya uçmazsanız:

alias ..g='git rev-parse && cd "$(git rev-parse --show-cdup)"'


6

Bu kabuk diğer adı, git alt dizininde veya en üst düzeyde olsanız da çalışır:

alias gr='[ ! -z `git rev-parse --show-toplevel` ] && cd `git rev-parse --show-toplevel || pwd`'

backticks yerine modern sözdizimini kullanacak şekilde güncellendi:

alias gr='[ ! -z $(git rev-parse --show-toplevel) ] && cd $(git rev-parse --show-toplevel || pwd)'

5
alias git-root='cd \`git rev-parse --git-dir\`; cd ..'

Diğer her şey bir noktada ya ana dizine gidiyor ya da sadece sefil başarısız oluyor. Bu, GIT_DIR'e geri dönmenin en hızlı ve en kısa yoludur.


Görünüşe göre 'git rev-parse --git-dir' en temiz çözüm.
Stabledog

3
-Dosyaları ve $GIT_DIRkullanılarak çalışma .gitağacından ayrıldığında bu başarısız olur gitdir: SOMEPATH. Sonuç olarak bu, alt modüller için de başarısız olur.$GIT_DIR içerdiği.git/modules/SUBMODULEPATH .
Tino

5

İşte her iki durumu da işleyen bir senaryo: 1) bir çalışma alanı ile depo, 2) çıplak depo.

https://gist.github.com/jdsumsion/6282953

git-root (yolunuzdaki yürütülebilir dosya):

#!/bin/bash
GIT_DIR=`git rev-parse --git-dir` &&
(
  if [ `basename $GIT_DIR` = ".git" ]; then
    # handle normal git repos (with a .git dir)
    cd $GIT_DIR/..
  else
    # handle bare git repos (the repo IS a xxx.git dir)
    cd $GIT_DIR
  fi
  pwd
)

Umarım bu yardımcı olur.


1
Keith, öneri için teşekkürler, senaryoyu ekledim.
jdsumsion

Aslında en iyi cevabı iptal ettim çünkü git execfikrin çıplak olmayan depolarda daha yararlı olduğunu fark ettim . Ancak, cevabımdaki bu komut dosyası, çıplak veya çıplak olmayan bir davayı doğru bir şekilde işliyor, bu da birine faydalı olabilir, bu yüzden bu yanıtı burada bırakıyorum.
jdsumsion

1
Ancak bu gibi bir şey içeren git submodules içinde başarısız . Ayrıca, dizinin çıplak olmayan durumda çalışma ağacının bir parçası olduğunu varsayarsınız . $GIT_DIR/.git/modules/SUBMODULE.git
Tino

4
$ git config alias.root '!pwd'
# then you have:
$ git root

Bu takma ad global olarak başarısız olur. Bunun yerine bunu kullanın (~ / .gitconfig içinde): [alias] findroot = "!f () { [[ -d ".git" ]] && echo "Found git in [pwd ]" && exit 0; cd .. && echo "IN pwd" && f;}; f"
FractalSpace

neden değer düşüklüğü? Lütfen herhangi bir hatayı vurgulayın veya iyileştirme önerin.
FractalSpace

1
Benim için git config --global alias.root '!pwd'çalışıyor. Küresel olmayan varyanttan farklı davrandığı hiçbir vakayı tespit edemedim. (Unix, git 1.7.10.4) BTW: Sonsuz findrootbir tekrardan /.gitkaçınmak için a'ya ihtiyacınız var .
Tino

4

Git 2.13.0'dan bu yana , bir alt modülün içinden kullanıldığında bile çalışan kök projesinin yolunu göstermek için yeni bir seçeneği destekler:

git rev-parse --show-superproject-working-tree

git-scm.com/docs/… . İlginç. Bunu kaçırmış olmalıyım. +1
VonC

3
Ancak uyarı: "Geçerli depo herhangi bir proje tarafından alt modül olarak kullanılmazsa hiçbir şey çıktılamaz."
VonC

Yorum için teşekkürler! Bunu fark etmemiştim.
Jordi Vilalta Prat

2

Kabuk Çerçevelerinde Önceden Yapılandırılmış Kabuk Takma Adları

Kabuk çerçevesi kullanıyorsanız, zaten bir kabuk takma adı olabilir:

  • $ grtiçinde oh-my-zsh (68k) ( cd $(git rev-parse --show-toplevel || echo "."))
  • $ git-rootiçinde prezto (8.8k) (görüntüler çalışma ağaç köküne yolu)
  • $ g.. zimfw (1k) (geçerli dizini çalışma ağacının en üst düzeyine değiştirir.)

1

Daniel Brockman'ın mükemmel yorumunu genişletmek istedim.

Tanımlama git config --global alias.exec '!exec ', aşağıdaki gibi şeyler yapmanızı sağlar git exec make, çünkü man git-configdurumlar:

Takma ad genişletmesinin önüne bir ünlem işareti gelirse, kabuk komutu olarak değerlendirilir. [...] Kabuk komutlarının, geçerli dizinin olması gerekmeyen bir deponun üst düzey dizininden yürütüleceğini unutmayın.

Ayrıca $GIT_PREFIX, bir deponun en üst düzey dizinine göre geçerli dizinin yolu olacağını bilmek de kullanışlıdır . Ancak, bunun savaşın sadece yarısı olduğunu bilmek ™. Kabuk değişken genişletmesi kullanımı oldukça zorlaştırır. Bu yüzden bash -cböyle kullanmanızı öneririz :

git exec bash -c 'ls -l $GIT_PREFIX'

diğer komutlar şunları içerir:

git exec pwd
git exec make

1

Herkesin bunu yapmak için POSIX uyumlu bir yola ihtiyaç duyması durumunda, gityürütülebilir dosya gerekmez:

git-root:

#$1: Path to child directory
git_root_recurse_parent() {
    # Check if cwd is a git root directory
    if [ -d .git/objects -a -d .git/refs -a -f .git/HEAD ] ; then
        pwd
        return 0
    fi

    # Check if recursion should end (typically if cwd is /)
    if [ "${1}" = "$(pwd)" ] ; then
        return 1
    fi

    # Check parent directory in the same way
    local cwd=$(pwd)
    cd ..
    git_root_recurse_parent "${cwd}"
}

git_root_recurse_parent

Sadece bir komut dosyasının parçası olarak işlevselliği istiyorsanız, shebang'ı kaldırın ve son git_root_recurse_parentsatırı aşağıdakiyle değiştirin :

git_root() {
    (git_root_recurse_parent)
}

Dikkat: Bu bir git repo'su olarak adlandırılmazsa, özyineleme hiç bitmez.
AH

@AH İkinci ififadenin özyinelemede dizini değiştirip değiştirmediğinizi kontrol etmesi gerekiyordu. Aynı dizinde kalırsa, bir yere yapıştığınızı varsayar (örn. /) Ve frenlerin tekrarını sağlar. Hata düzeltildi ve şimdi beklendiği gibi çalışmalı. Gösterdiğiniz için teşekkürler.
swalog

0

Bunu bugün kendim çözmek zorunda kaldım. Bir program için ihtiyaç duyduğum gibi C # 'da çözüldü, ama sanırım esily yeniden yazılabilir. Bu Kamusal Alan'ı düşünün.

public static string GetGitRoot (string file_path) {

    file_path = System.IO.Path.GetDirectoryName (file_path);

    while (file_path != null) {

        if (Directory.Exists (System.IO.Path.Combine (file_path, ".git")))
            return file_path;

        file_path = Directory.GetParent (file_path).FullName;

    }

    return null;

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.