710 Stimmen

Wie kann ich in ein nicht leeres Verzeichnis klonen?

Ich habe ein Verzeichnis A mit Dateien, die mit Verzeichnis B übereinstimmen. Verzeichnis A kann weitere benötigte Dateien enthalten. Verzeichnis B ist ein Git-Repositorium.

Ich möchte das Verzeichnis B in das Verzeichnis A klonen, aber Git-Clone erlaubt mir das nicht, da das Verzeichnis nicht leer ist.

Ich hatte gehofft, es würde nur .git klonen und da alle Dateien übereinstimmen, könnte ich von dort aus gehen?

Ich kann nicht in ein leeres Verzeichnis klonen, weil ich Dateien im Verzeichnis A habe, die nicht im Verzeichnis B sind, und ich möchte sie behalten.

Das Kopieren von .git ist keine Option, da ich Refs zum Pushen/Pullen benötige und diese nicht manuell einrichten möchte.

Gibt es eine Möglichkeit, dies zu tun?

Update: Ich glaube, das funktioniert, kann jemand Probleme erkennen? -->

cd a
git clone --no-hardlinks --no-checkout ../b a.tmp 
mv a.tmp/.git .
rm -rf a.tmp
git unstage # apparently git thinks all the files are deleted if you don't do this

1 Stimmen

Ich frage mich nur, was passieren würde, wenn '--no-checkout' weggelassen würde, außer dass der temporäre Klon mehr Speicherplatz und Zeit verbraucht. Wäre "git unstage" oder etwas anderes immer noch notwendig?

0 Stimmen

Vielleicht git-force-clone ?

22voto

Ken Williams Punkte 21163

Ein anderes einfaches Rezept scheint mir gut zu gelingen:

git clone --bare $URL .git
git config --unset core.bare

Mein Hauptanwendungsfall für das Auschecken in ein Verzeichnis mit vorhandenen Dateien ist die Kontrolle meiner Unix-Dotfiles mit Git. Bei einem neuen Konto befinden sich im Home-Verzeichnis bereits einige Dateien, möglicherweise sogar die, die ich von Git abrufen möchte.

17voto

KuttKatrea Punkte 161

Ich habe das vor ein paar Augenblicken benutzt, das erfordert die wenigsten potentiell zerstörerischen Befehle:

cd existing-dir
git clone --bare repo-to-clone .git
git config --unset core.bare
git remote rm origin
git remote add origin repo-to-clone
git reset

Und voilà!

8voto

Vlado Punkte 2927

Ich hatte ein ähnliches Problem mit einem neuen Apache-Webverzeichnis (Konto mit WHM erstellt), das ich als Staging-Webserver verwenden wollte. Ich musste zunächst mein neues Projekt mit der dortigen Codebasis klonen und regelmäßig Änderungen durch Abrufen aus dem Repository bereitstellen.

Das Problem war, dass das Konto bereits Webserverdateien enthielt:

.bash_history
.bash_logout
.bash_profile
.bashrc
.contactemail
.cpanel/
...

...die ich weder löschen noch in mein Repository übertragen wollte. Ich brauchte sie, um dort einfach unstaged und untracked zu bleiben.

Was ich getan habe:

Ich bin zu meinem Webordner (existing_folder) gegangen:

cd /home/existing_folder

und dann:

git init
git remote add origin PATH/TO/REPO
git pull origin master
git status

Es zeigte (wie erwartet) eine Liste vieler nicht bereitgestellter Dateien an - diejenigen, die bereits ursprünglich in meinem cPanel-Webkonto vorhanden waren.

Dann, dank der dieser Artikel habe ich gerade die Liste dieser Dateien hinzugefügt:

**.git/info/exclude**

Diese Datei, fast wie die Datei .gitignore können Sie Dateien von der Auslagerung ausschließen. Danach hatte ich nichts mehr im .git/-Verzeichnis zu übertragen - es funktioniert wie eine persönliche .gitignore die niemand sonst sehen kann.

Jetzt prüfen git status zurück:

On branch master
nothing to commit, working tree clean

Jetzt kann ich Änderungen an diesem Webserver bereitstellen, indem ich sie einfach aus meinem Git-Repository ziehe. Ich hoffe, dies hilft einigen Webentwicklern bei der einfachen Erstellung eines Staging-Servers.

8voto

Mike6679 Punkte 5189

Das hat bei mir funktioniert:

cd existing_folder
git init
git remote add origin path_to_your_repo.git
git add .
git commit
git push -u origin master

7voto

Kevin Le - Khnle Punkte 9990

Bei mir hat das Folgende funktioniert. Zuerst würde ich sicherstellen, dass die Dateien im a Verzeichnis sind quellengesteuert:

$ cd a
$ git init
$ git add .
$ git commit -m "..."

Dann

$ git remote add origin https://URL/TO/REPO
$ git pull origin master --allow-unrelated-histories
$ git push origin master

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