2121 Stimmen

Wie kann ich nur ein Unterverzeichnis eines Git-Repositorys klonen?

Ich habe mein Git-Repository, das im Stammverzeichnis zwei Unterverzeichnisse hat:

/finisht
/static

Als dies der Fall war SVN , /finisht wurde an einem Ort ausgecheckt, während /static wurde an anderer Stelle überprüft, etwa so:

svn co svn+ssh://admin@domain.com/home/admin/repos/finisht/static static

Gibt es eine Möglichkeit, dies mit Git zu tun?

18 Stimmen

Mögliche Duplikate von Unterverzeichnisse in Git auschecken?

2 Stimmen

Für einen Nutzer des Jahres 2014, was die git clone einfachsten Befehl? Ich habe este einfache Antwort . Wenn es etwas mehr einfach, bitte kommentieren

1 Stimmen

Für diejenigen, die versuchen, den Inhalt des Repositorys zu klonen (und nicht den Root-Ordner zu erstellen), ist dies eine sehr einfache Lösung: stackoverflow.com/questions/6224626/

6voto

jxramos Punkte 6062

Hier ist ein Shell-Skript, das ich für den Anwendungsfall eines Spar-Checkouts für ein einzelnes Unterverzeichnis geschrieben habe

coSubDir.sh

localRepo=$1
remoteRepo=$2
subDir=$3

# Create local repository for subdirectory checkout, make it hidden to avoid having to drill down to the subfolder
mkdir ./.$localRepo
cd ./.$localRepo
git init
git remote add -f origin $remoteRepo
git config core.sparseCheckout true

# Add the subdirectory of interest to the sparse checkout.
echo $subDir >> .git/info/sparse-checkout

git pull origin master

# Create convenience symlink to the subdirectory of interest
cd ..
ln -s ./.$localRepo/$subDir $localRepo

2 Stimmen

Nettes Skript, das einzige, was behoben werden sollte, ist der Symlink, sollte sein ln -s ./.$localRepo/$subDir $localRepo 代わりに ln -s ./.$localRepo$subDir $localRepo

3voto

YenForYang Punkte 2152

Ich schrieb eine .gitconfig [alias] für die Durchführung eines "spärlichen Checkouts". Probieren Sie es aus (kein Wortspiel beabsichtigt):

Unter Windows laufen in cmd.exe

git config --global alias.sparse-checkout "!f(){ [ $# -eq 2 ] && L=${1##*/} L=${L%.git} || L=$2; mkdir -p \"$L/.git/info\" && cd \"$L\" && git init --template= && git remote add origin \"$1\" && git config core.sparseCheckout 1; [ $# -eq 2 ] && echo \"$2\" >> .git/info/sparse-checkout || { shift 2; for i; do echo $i >> .git/info/sparse-checkout; done }; git pull --depth 1 origin master;};f"

Ansonsten:

git config --global alias.sparse-checkout '!f(){ [ $# -eq 2 ] && L=${1##*/} L=${L%.git} || L=$2; mkdir -p "$L/.git/info" && cd "$L" && git init --template= && git remote add origin "$1" && git config core.sparseCheckout 1; [ $# -eq 2 ] && echo "$2" >> .git/info/sparse-checkout || { shift 2; for i; do echo $i >> .git/info/sparse-checkout; done }; git pull --depth 1 origin master;};f'

Verwendung :

# Makes a directory ForStackExchange with Plug checked out
git sparse-checkout https://github.com/YenForYang/ForStackExchange Plug

# To do more than 1 directory, you have to specify the local directory:
git sparse-checkout https://github.com/YenForYang/ForStackExchange ForStackExchange Plug Folder

El git config Befehle sind der Einfachheit und der Speicherung halber "verkleinert", aber hier ist der Alias erweitert:

# Note the --template= is for disabling templates.
# Feel free to remove it if you don't have issues with them (like I did)
# `mkdir` makes the .git/info directory ahead of time, as I've found it missing sometimes for some reason
f(){
    [ "$#" -eq 2 ] && L="${1##*/}" L=${L%.git} || L=$2;
    mkdir -p "$L/.git/info"
        && cd "$L"
        && git init --template=
        && git remote add origin "$1"
        && git config core.sparseCheckout 1;
    [ "$#" -eq 2 ]
        && echo "$2" >> .git/info/sparse-checkout
        || {
            shift 2;
            for i; do
                echo $i >> .git/info/sparse-checkout;
            done
        };
    git pull --depth 1 origin master;
};
f

0 Stimmen

Warum funktioniert das? L=${1##*/} L=${L%.git} ? Ist der Weltraum ein Operator?

0 Stimmen

Sie sollten erwähnen, dass dies für Git < 2.25.0 (Jan 2020) gilt, das seine eigene Version von git sparse-checkout .

3voto

Eric Stricklin Punkte 21

Viele großartige Antworten hier, aber ich wollte hinzufügen, dass die Verwendung der Anführungszeichen um die Verzeichnisnamen bei mir auf Windows Sever 2016 fehlgeschlagen ist. Die Dateien wurden einfach nicht heruntergeladen.

Anstelle von

"mydir/myfolder"

Ich musste die

mydir/myfolder

Wenn Sie einfach alle Unterverzeichnisse herunterladen möchten, verwenden Sie einfach

git sparse-checkout set *

2voto

weberjn Punkte 1688

Wenn Sie eigentlich nur an den letzten Revisionsdateien eines Verzeichnisses interessiert sind, können Sie bei Github ein Repository als Zip-Datei herunterladen, die keinen Verlauf enthält. Das Herunterladen ist also sehr viel schneller.

1voto

expelledboy Punkte 1626

Obwohl ich es hasse, svn zu benutzen, wenn ich mit Git-Repos zu tun habe :/ benutze ich das ständig;

function git-scp() (
  URL="$1" && shift 1
  svn export ${URL/blob\/master/trunk}
)

Dies ermöglicht es Ihnen, von der Github-URL ohne Änderung zu kopieren. Verwendung;

--- /tmp » git-scp https://github.com/dgraph-io/dgraph/blob/master/contrib/config/kubernetes/helm                                                                                                                  1 
A    helm
A    helm/Chart.yaml
A    helm/README.md
A    helm/values.yaml
Exported revision 6367.

--- /tmp » ls | grep helm
Permissions Size User    Date Modified    Name
drwxr-xr-x     - anthony 2020-01-07 15:53 helm/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X