UNPKG

nx

Version:

The core Nx plugin contains the core functionality of Nx like the project graph, nx commands and task orchestration.

46 lines (45 loc) 1.8 kB
/** * This is meant to be used with `git filter-branch --tree-filter` to rewrite * history to only include commits related to the source project folder. If the * destination folder is different, this script also moves the files over. * * Example: * NX_IMPORT_SOURCE=<source> NX_IMPORT_DESTINATION=<destination> git filter-branch --tree-filter 'node git-utils.tree-filter.js' --prune-empty -- --all */ const { execSync } = require('child_process'); const { existsSync, mkdirSync, renameSync, rmSync } = require('fs'); // NOTE: The path passed to `git filter-branch` is POSIX, so we need to use the `posix` module. const { posix } = require('path'); try { // NOTE: Using env vars because Windows PowerShell has its own handling of quotes (") messes up quotes in args, even if escaped. const src = process.env.NX_IMPORT_SOURCE; const dest = process.env.NX_IMPORT_DESTINATION; const files = execSync(`git ls-files -z ${src}`, { windowsHide: false, }) .toString() .trim() .split('\x00') .map((s) => s.trim()) .filter(Boolean); for (const file of files) { if (src === '' || file.startsWith(src)) { // If source and destination are the same, then keep the file as is. if (src === dest) continue; const destFile = posix.join(dest, file.replace(src, '')); const dir = posix.dirname(destFile); if (!existsSync(dir)) mkdirSync(dir, { recursive: true }); renameSync(file, destFile); } else { // If not matching the source we are filtering, remove it. rmSync(file); } } } catch (error) { console.error(`Error executing Git commands: ${error}`); process.exit(1); }