249 votes

Comment mettre en ne scène qu’une partie d’un nouveau fichier avec git ?

J' aime git add --interactive. Il fait maintenant partie de mon travail quotidien.

Le problème semble qu'il ne fonctionne pas avec sans traces de fichiers. Ce que je veux faire est de suivre un nouveau fichier, mais seulement ajouter de la partie, c'est à dire certaines parties de ce fichier ne sont pas encore prêts à être mis en scène.

Par exemple, avec la commande git add -je, je peux choisir le patch option et même de modifier individuellement les beaux mecs dans le but de mettre en scène des pièces du nouveau code, en laissant le code de débogage commentaires unstaged. J'aime travailler de cette façon parce qu'il est évident que les lieux de la mega patch, je suis actuellement en train de travailler sur encore besoin de travail.

Malheureusement, je ne semble pas être en mesure de faire la même chose avec un sans traces de fichier. Soit je l'étape de l'ensemble du fichier, ou rien. La solution de contournement que j'ai utilisé est la mise en scène ou même de commettre un nouveau fichier lorsqu'il est vide, et puis la mise en scène des changements dans la manière habituelle. Mais cette solution se sent comme un sale hack et si j'oublie, ou changer mon esprit, il crée plus de problèmes qu'il devrait être.

La question est donc: Comment faire pour que le cadre d'un nouveau fichier, de sorte que ce nouveau fichier de suivi, mais en laissant la totalité ou une partie de son contenu unstaged?

480voto

Richard Hansen Points 13044

Waouh, tout ce que et affaires semble trop compliqué. Que diriez-vous ce lieu :

De `` :

16voto

Nate Burke Points 161
git add -N new_file
git add -p new_file

Sélectionnez ensuite le modifier (e) de l'option. Utilisez votre éditeur de texte pour supprimer les lignes que vous ne voulez pas dans votre première livraison du fichier. L'enregistrer.

Lorsque vous exécutez git status vous verrez new_file mis en scène comme un "nouveau fichier", avec les lignes que vous avez supprimé répertorié comme "modifié" en vertu des modifications ne sont pas mis en scène pour la validation. Vous pouvez valider le nouveau fichier, puis exécutez git add -p new_file nouveau pour continuer à commettre d'autres mecs.

Grâce à Jordan Lewis pour le rappeler.

8voto

sehe Points 123151
git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile
git add --interactive newfile

Simple démo:

mkdir /tmp/demo
cd /tmp/demo
git init .

echo hello > newfile
git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile
  • Astuce Si vous êtes certain que le "vide" blob existe déjà dans votre git objet de base de données, vous pouvez coder en dur la table de hachage e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 à la place. Je ne recommande pas de faire that_
  • Astuce Si vous êtes sur Windows, vous pouvez probablement juste utiliser NUL: au lieu de /dev/null. Sinon, utilisez quelque chose comme echo -n '' | git hash-object --stdin -w

Maintenant, l'indice contiendra newfile comme le vide de blob et le vide blob a été entré dans la base de données objet si elle n'existait pas encore:

$ find .git/objects/ -type f 
.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391

$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   newfile
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   newfile
#

$ git diff
diff --git a/newfile b/newfile
index e69de29..ce01362 100644
--- a/newfile
+++ b/newfile
@@ -0,0 +1 @@
+hello

Cela devrait être précisément ce que vous voulez. Je recommande également le vim fugitif plugin pour très intelligent de gestion d'index (voir Mieux git add -p?)

7voto

Chronial Points 15402

Un peu en retard à la fête, mais je voudrais ajouter ceci, comme cela semble être manquante sur cette page: le moyen Le plus facile pour cela (et à mon humble avis, mise en scène interactive en général) git gui. Il est livré avec git et devrait fonctionner sur presque toutes les plates-formes prises en charge par git. Exécutez simplement git gui tout un gui à ouvrir qui va permettre facilement la mise en scène et unstaging les beaux mecs, et même des lignes simples de suivi et sans traces de fichiers.

enter image description here

3voto

dave1010 Points 6595

Edit: cela ne semble pas fonctionner maintenant. Je suis sûr que c'était avant (sur git 1.7.1). Dans le cas où il ne fonctionne pas, je suggère la mise en scène /dev/null comme sehe suggère ci-dessus:

git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile

Si vous êtes sur Windows (sans /dev/null), alors vous pouvez le remplacer par le chemin d'accès à un fichier vide.

Réponse originale à cette question

Vous voulez

git add -p # (or --patch)

Cela ajoute non chaînée fichiers pour moi. À partir de la page de man:

Choisir interactivement les beaux mecs de patch entre l'index et le travail de l'arbre et les ajouter à l'index. Cela donne l'utilisateur l'occasion de l'examen de la différence avant d'ajouter modifié contenu de l'index.

Cela s'exécute efficacement ajouter --interactive, mais ignore la commande initiale menu et directement les sauts vers le patch de la commande. Voir "Mode interactif" pour plus de détails.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X