521 Stimmen

Handhabung von Dateiumbenennungen in Git

Das hatte ich gelesen, als Umbenennen von Dateien in Git Wenn Sie die Datei umbenannt haben, sollten Sie alle Änderungen festschreiben, die Datei umbenennen und dann die umbenannte Datei bereitstellen. Git erkennt die Datei anhand ihres Inhalts, anstatt sie als neue, nicht verfolgte Datei zu betrachten, und behält den Änderungsverlauf bei.

Als ich jedoch heute Abend genau das tat, kehrte ich zurück zu git mv .

> $ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#    modified:   index.html
#

Ich habe mein Stylesheet umbenannt in Finder から iphone.css a mobile.css :

> $ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#    modified:   index.html
#
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#    deleted:    css/iphone.css
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#    css/mobile.css

Git denkt nun, ich hätte eine CSS-Datei gelöscht und eine neue hinzugefügt. Das ist nicht das, was ich will. Machen wir die Umbenennung rückgängig und lassen Git die Arbeit machen.

> $ git reset HEAD .
Unstaged changes after reset:
M    css/iphone.css
M    index.html

Ich bin wieder da, wo ich angefangen habe:

> $ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#    modified:   index.html
#

Verwenden wir git mv stattdessen:

> $ git mv css/iphone.css css/mobile.css
> $ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#    renamed:    css/iphone.css -> css/mobile.css
#
# 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:   index.html
#

Es sieht so aus, als wäre alles in Ordnung. Warum hat Git die Umbenennung nicht gleich beim ersten Mal erkannt, als ich den Finder benutzt habe?

0voto

Georgiy Bukharov Punkte 229

Als ich meine Ordner und Dateien in Großbuchstaben geschrieben habe, habe ich Node.js' Dateisystem um dieses Problem zu lösen.

Vergessen Sie nicht, sich zu verpflichten, bevor Sie beginnen. Ich bin nicht sicher, wie stabil es ist :)

  1. Erstellen Sie eine Skriptdatei im Projekt Root.

    // File rename.js

    const fs = require('fs').promises; const util = require('util'); const exec = util.promisify(require('child_process').exec);

    const args = process.argv.slice(2); const path = args[0];

    const isCapitalized = (s) => s.charAt(0) === s.charAt(0).toUpperCase();

    const capitalize = (s) => s.charAt(0).toUpperCase() + s.slice(1);

    async function rename(p) { const files = await fs.readdir(p, { withFileTypes: true }); files.forEach(async (file) => { const { name } = file; const newName = capitalize(name); const oldPath = ${p}/${name}; const dumbPath = ${p}/dumb; const newPath = ${p}/${newName}; if (!isCapitalized(name) && name !== 'i18n' && name !== 'README.md') { // 'git mv' won't work if we only changed size of letters. // That's why we need to rename to dumb name first, then back to current. await exec(git mv ${oldPath} ${dumbPath}); await exec(git mv ${dumbPath} ${newPath}); } if (file.isDirectory()) { rename(newPath); } }); }

    rename(path);

Um alle Dateien in einem Verzeichnis (oder eine einzelne Datei) umzubenennen, ist das Skript einfacher:

// rename.js

const fs = require('fs').promises;
const util = require('util');
const exec = util.promisify(require('child_process').exec);
const args = process.argv.slice(2);
const path = args[0];

async function rename(p) {
  const files = await fs.readdir(p, { withFileTypes: true });
  files.forEach(async (file) => {
    const { name } = file;
    const currentPath = `${p}/${name}`;
    const dumbPapth = `${p}/dumb`;
    await exec(`git mv ${currentPath} ${dumbPath}`);
    await exec(`git mv ${dumbPath} ${currentPath}`);
    if (file.isDirectory()) {
      rename(newPath);
    }
  });
}

rename(path);
  1. Das Skript mit Argumenten ausführen

    node rename.js ./frontend/apollo/queries

Ausführen von Shell-Skript-Dateien oder -Befehlen mit Node.js

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