Puis-je utiliser git diff sur des fichiers non suivis?

Est-il possible de demander à git diff d’inclure des fichiers non suivis dans sa sortie diff? Ou est-ce que mon meilleur pari pour append les nouveaux fichiers que j’ai créés et les fichiers existants que j’ai édités et utiliser?

git diff --cached 

?

Avec les versions récentes de git, vous pouvez git add -N le fichier (ou --intent-to-add ), ce qui ajoute un blob de longueur nulle à l’index à cet emplacement. Le résultat est que votre fichier “non suivi” devient maintenant une modification pour append tout le contenu à ce fichier de longueur nulle, et cela apparaît dans la sortie “git diff”.

 git diff echo "this is a new file" > new.txt git diff git add -N new.txt git diff diff --git a/new.txt b/new.txt index e69de29..3b2aed8 100644 --- a/new.txt +++ b/new.txt @@ -0,0 +1 @@ +this is a new file 

Malheureusement, comme vous l’avez fait remarquer, vous ne pouvez pas vous git stash alors que vous avez un --intent-to-add en attente comme celui-ci. Bien que si vous devez vous cacher, il vous suffit d’append les nouveaux fichiers, puis de les cacher. Ou vous pouvez utiliser la solution de contournement d’émulation:

 git update-index --add --cacheinfo \ 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt 

(mettre en place un alias est votre ami ici).

Je crois que vous pouvez modifier les fichiers de votre index et les fichiers non suivis en fournissant simplement le chemin d’access aux deux fichiers.

 git diff --no-index tracked_file untracked_file 

Pour mon jeu interactif au jour le jour (où je diffère l’arbre de travail contre HEAD tout le temps, et je voudrais que les fichiers non suivis soient inclus dans le diff), add -N/--intent-to-add est inutilisable, parce que ça casse

Alors, voici mon remplacement git diff . Ce n’est pas une solution particulièrement propre, mais comme je ne l’utilise que de manière interactive, je suis d’accord avec un hack:

 d() { if test "$#" = 0; then ( git diff --color git ls-files --others --exclude-standard | while read -ri; do git diff --color -- /dev/null "$i"; done ) | `git config --get core.pager` else git diff "$@" fi } 

Taper simplement d inclura les fichiers non suivis dans le diff (ce qui m’intéresse dans mon workflow), et d args... se comportera comme git diff .

Remarques:

  • Nous utilisons le fait ici que git diff n’est en réalité que des diffs individuels concaténés, il n’est donc pas possible de dire la sortie d d’un “vrai diff” – sauf que tous les fichiers non suivis sont sortingés en dernier.
  • Le seul problème avec cette fonction est que la sortie est colorée même si redirigée; mais je ne peux pas être dérangé pour append de la logique à cela.
  • Je ne pouvais trouver aucun moyen d’obtenir des fichiers non suivis en assemblant simplement une liste d’arguments gloutons pour git diff . Si quelqu’un découvre comment faire ou si une fonctionnalité est ajoutée à git dans le futur, veuillez laisser une note ici!

Pas 100% au point, mais comme il n’y a pas de réponse vraiment satisfaisante, ici encore une autre de ce genre;

 less $(git ls-files --others --exclude-standard) 

Naviguez entre eux avec: n et: p pour le suivant et le précédent.

Les modifications fonctionnent lorsqu’elles sont mises en scène ou non avec cette commande. Les nouveaux fichiers fonctionnent lorsque mis en scène:

 $ git diff HEAD 

S’ils ne sont pas mis en scène, vous ne verrez que les différences de fichiers.

cela fonctionne pour moi:

 git add my_file.txt git diff --cached my_file.txt git reset my_file.txt 

La dernière étape est facultative, il laissera le fichier dans l’état précédent (non suivi)

utile si vous créez aussi un patch:

  git diff --cached my_file.txt > my_file-patch.patch 

git add -A git diff HEAD génère un patch si nécessaire et ensuite

git reset HEAD

Habituellement, lorsque je travaille avec des équipes de sites distants, il est important pour moi d’avoir une connaissance préalable des modifications apscopes par les autres équipes dans le même fichier, avant de suivre les étapes git -> staged -> commit pour lesquelles j’ai écrit un script bash m’aider à éviter les résolutions inutiles fusionner les conflits avec l’équipe distante ou créer une nouvelle twig locale et comparer et fusionner sur la twig principale

 #set -x branchname=`git branch | grep -F '*' | awk '{print $2}'` echo $branchname git fetch origin ${branchname} for file in `git status | grep "modified" | awk "{print $2}" ` do echo "PLEASE CHECK OUT GIT DIFF FOR "$file git difftool FETCH_HEAD $file ; done 

Dans le script ci-dessus, je récupère la twig principale distante (pas nécessairement sa twig principale) dans FETCH_HEAD. Ils font uniquement la liste de mes fichiers modifiés et comparent les fichiers modifiés avec git difftool.

ici, beaucoup de difftool supportés par git, je configure ‘Meld Diff Viewer’ pour une bonne comparaison avec l’interface graphique.

Pour un fichier:

 git diff --no-index /dev/null new_file 

Pour tous les nouveaux fichiers:

 for next in $( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null $next; done; 

Comme alias:

 alias gdnew="for next in \$( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null \$next; done;" 

Pour tous les fichiers modifiés et nouveaux combinés en une seule commande:

 { git --no-pager diff; gdnew ; } 

En supposant que vous ne disposez pas de commits locaux,

 git diff origin/master