J'ai une copie de travail du projet, sans aucune métadonnée de contrôle de source. Maintenant, je voudrais faire l'équivalent de git-clone dans ce dossier et conserver mes modifications locales.
git-clone ne me permet pas de cloner dans un dossier existant. Quelle est la meilleure pratique ici?
Réponses:
Cela peut être fait en clonant vers un nouveau répertoire, puis en déplaçant le
.git
répertoire dans votre répertoire existant.Si votre répertoire existant est nommé "code".
Cela peut également être fait sans effectuer de vérification lors de la commande clone; plus d'informations peuvent être trouvées ici .
la source
git clone
la première commande, aucune autre commande d'extraction n'est nécessaire. Si vous utilisez plutôt quelque chose commegit clone --no-checkout
dans cette première étape, après le déplacement du répertoire .git, il sera nécessaire d'utilisergit reset HEAD
pour dire à git que les fichiers n'ont pas été supprimés.git status
.Ne clonez pas, récupérez à la place. Dans le repo:
Ensuite, vous pouvez réinitialiser l'arborescence pour obtenir le commit que vous souhaitez:
et vous êtes comme vous avez cloné.
La question intéressante ici (et celle sans réponse): Comment savoir sur quel commit votre arbre nu était basé, d'où la position dans laquelle réinitialiser.
la source
Ce que j'ai fait pour extraire la branche principale dans un répertoire existant:
la source
-t
drapeau est utilisé ici?Je voudrais
git clone
dans un nouveau répertoire et copier le contenu du répertoire existant dans le nouveau clone.la source
git clone wherever tmp && git mv tmp/.git . && rm -rf tmp
En d'autres termes, déplacer le.git
répertoire d'un clone temporaire semble plus simple que de nettoyer l'arborescence de travail du clone et d'y copier les fichiers existants.git mv tmp/.git .
revientfatal: cannot move directory over file, source=tmp/.git, destination=.git
pour moi. Quelqu'un sait-il quel est le problème?mv
, nongit mv
; bien que cela n'explique pas pourquoi vous avez.git
déjà un fichier (contenantgitdir: some/path/to/a/git-dir
un «gitfile»; s'il n'était pas là, alors vous l'auriez vu à lafatal: Not a git repository (or any of the parent directories): .git
place).L'utilisation d'un répertoire temporaire est très bien, mais cela fonctionnera si vous voulez éviter cette étape. Depuis la racine de votre répertoire de travail:
la source
git reset --hard origin/master
supprimera tous les fichiers locaux.hard
etmixed
est que mixte gardera les changements locaux (donc si vous essayez plus tard de tirer ça va vous montrer par exemple ne peut pas tirer avec rebasage. Vous avez des changements Unstaged S'il vous plaît engager ou les cacher ) , tandis que le durla source
git reset --hard
nuke les modifications du fichier local, en particulier PAS ce que ce PO a demandé.--mixed
devrait être utilisé à la place.Pour cloner un dépôt git dans un répertoire existant vide, procédez comme suit:
Remarquez le
.
à la fin de votregit clone
commande. Cela va télécharger le dépôt dans le répertoire de travail actuel.la source
fatal: destination path '.' already exists and is not an empty directory.
Beaucoup de réponses déjà pour le faire de la manière demandée par le PO. Mais il convient de noter que le faire dans le sens inverse est beaucoup plus simple:
Vous avez maintenant l'état cible souhaité - nouveau clone + changements locaux.
la source
Il y a deux approches à cela. Dans la mesure du possible, je commencerais par un dossier propre pour votre nouveau répertoire de travail git, puis je copierais votre version des choses plus tard. Cela pourrait ressembler à quelque chose comme *:
À ce stade, vous devriez avoir une copie de travail assez propre avec votre dossier de travail précédent en tant que répertoire de travail actuel afin que toutes les modifications incluent des suppressions de fichiers apparaîtront sur le radar si vous exécutez
git status
.D'un autre côté, si vous devez vraiment le faire dans l'autre sens, vous pouvez obtenir le même résultat avec quelque chose comme ceci:
Quoi qu'il en soit, la première chose que je ferais serait d'exécuter quelque chose comme
git stash
pour obtenir une copie de toutes vos modifications locales mises de côté, puis vous pouvez les réappliquer et déterminer celles que vous souhaitez engager.* Les deux exemples supposent que vous démarrez sur le shell dans le répertoire parent de votre projet.
la source
C'est la meilleure de toutes les méthodes que j'ai rencontrées
Clonez uniquement le dossier .git du référentiel (à l'exclusion des fichiers car ils se trouvent déjà
existing-dir
) dans un répertoire temporaire videgit clone --no-checkout repo-path-to-clone existing-dir/existing-dir.tmp
// pourrait vouloir --no-hardlinks pour cloner le dépôt localDéplacez le dossier .git vers le répertoire contenant les fichiers. Cela fait
existing-dir
un dépôt git.mv existing-dir/existing-dir.tmp/.git existing-dir/
Supprimer le répertoire temporaire
rmdir existing-dir/existing-dir.tmp
cd existing-dir
Git pense que tous les fichiers sont supprimés, cela ramène l'état du dépôt à HEAD.
AVERTISSEMENT: toutes les modifications locales apportées aux fichiers seront perdues.
git reset --mixed HEAD
la source
Si vous utilisez au moins git 1.7.7 (qui a enseigné
clone
l'--config
option), pour transformer le répertoire actuel en une copie de travail:Cela fonctionne par:
.git
dossier--mirror
transforme le nouveau clone en un dossier de métadonnées purement comme il.git
doit être--config core.bare=false
contrecarre l'implicitebare=true
de l'--mirror
option, permettant ainsi au référentiel d'avoir un répertoire de travail associé et d'agir comme un clone normalCela ne fonctionnera évidemment pas si un
.git
répertoire de métadonnées existe déjà dans le répertoire que vous souhaitez transformer en copie de travail.la source
[core]
section de la configuration locale comprenant à la foisbare = true
etbare = false
. Plus problématique est qu'elle aura les mauvaises valeurs pour laorigin
télécommande, avec la[remote "origin"]
section incluantmirror = true
et une spécification de récupération qui ne fonctionnera pas correctement avec une copie de travail. Après avoir résolu ces problèmes, le clonage normal et le déplacement des nouvelles copies de travail.git
auront été plus efficaces.Habituellement, je clone d'abord le référentiel initial, puis je déplace tout le contenu du dossier existant vers le référentiel initial. Ça marche à chaque fois.
L'avantage de cette méthode est que vous ne manquerez rien du référentiel initial, y compris README ou .gitignore.
Vous pouvez également utiliser la commande ci-dessous pour terminer les étapes:
la source
Vous pouvez le faire en tapant récursivement les lignes de commande suivantes:
la source
Utilisez simplement le. à la fin de la
git clone
commande (se trouvant dans ce répertoire), comme ceci:la source