This repository was archived by the owner on Aug 20, 2026. It is now read-only.

Repository files navigation

SyncFileContents

Warning

This repository is archived and no longer maintained.

Its functionality has moved to ktsu-dev/KtsuTools as the ktsu sync command, which is a direct port with the same --path / --filename shape plus multi-filename support and --auto-push.

For the interactive, iterative-merge take on the same problem, see ktsu-dev/BlastMerge (published as ktsu.BlastMerge), which additionally supports directory exclusion and saved batch configurations.

The open feature requests were migrated to KtsuTools issues #125 (commit to a new branch), #126 (open a PR per synced branch), #127 (explicit repo lists and exclusions) and #128 (config from file).

This code was never published to nuget.org. It remains readable here for reference.

GitHub branch status

LicenseGitHub commit activityGitHub contributorsGitHub Actions Workflow Status

SyncFileContents is a .NET 9 console application that scans a directory for files with a specified name, compares their contents using SHA256 hashes, and allows the user to synchronize these files across the directory. It also provides Git integration for committing and pushing changes.

Features

  • Recursively scan a specified directory for files with a given name
  • Support for multiple filenames (comma-separated) and wildcard patterns
  • Compare file contents using SHA256 hashes
  • Display file paths grouped by hash with the oldest modification time for each hash group
  • Sort hash groups by modification time (most recent first)
  • Synchronize file contents across different directories within the scanned path
  • Automatically skip files in nested Git repositories (submodules)
  • Commit changes to Git repositories with automatic staging
  • Fetch, merge, and push changes to remote repositories
  • Interactive prompts with persistent history for paths and filenames
  • Persistent Git credentials storage

Table of Contents

Installation

To use SyncFileContents, you need to have .NET 9 SDK installed on your machine.

Clone the repository:

git clone https://github.com/ktsu-dev/SyncFileContents.git

Navigate to the project directory:

cd SyncFileContents

Build the project:

dotnet build

Usage

Run the application with optional command-line arguments:

dotnet run -- [path] [filename]

Command-Line Arguments

  • path: The path to recursively scan in. If not provided, you will be prompted to enter it interactively.
  • filename: The filename to scan for. If not provided, you will be prompted to enter it interactively. Supports wildcards and comma-separated values.

Example Usage

To scan the current directory for files named example.txt and synchronize their contents:

dotnet run -- . example.txt

To scan a specific directory for multiple config files:

dotnet run -- /path/to/projects "config.json,settings.json"

To run interactively without arguments:

dotnet run

Workflow

  1. Scan: The application recursively scans the specified directory for files matching the filename pattern
  2. Compare: Files are grouped by SHA256 hash to identify differing versions
  3. Display: Shows each unique hash with the oldest modification time for that hash group and associated file paths, sorted by modification time (most recent first)
  4. Select: If there are exactly two hash groups, the most recent is suggested first, then the older one if declined; otherwise, you enter the hash to use as the sync source
  5. Preview: A dry-run shows which files will be updated
  6. Sync: After confirmation, files are copied from the source to all destinations
  7. Commit: Outstanding changes in Git repositories can be committed
  8. Push: Repositories with only SyncFileContents commits can be automatically pushed

Git Credentials

On first run, you'll be prompted to enter your Git username and personal access token. These credentials are stored locally and used for push operations.

Development

Prerequisites

Building the Project

Clone the repository and navigate to the project directory:

git clone https://github.com/ktsu-dev/SyncFileContents.git
cd SyncFileContents

Build the project:

dotnet build

Running Tests

To run the tests, use the following command:

dotnet test

License

This project is licensed under the MIT License. See the LICENSE file for details.

About

A .NET console application that finds files sharing a given name across a directory tree, compares their contents by SHA256 hash, and synchronizes them to a single chosen version.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Aug 20, 2026. It is now read-only.

Repository files navigation

SyncFileContents

Warning

This repository is archived and no longer maintained.

Its functionality has moved to ktsu-dev/KtsuTools as the ktsu sync command, which is a direct port with the same --path / --filename shape plus multi-filename support and --auto-push.

For the interactive, iterative-merge take on the same problem, see ktsu-dev/BlastMerge (published as ktsu.BlastMerge), which additionally supports directory exclusion and saved batch configurations.

The open feature requests were migrated to KtsuTools issues #125 (commit to a new branch), #126 (open a PR per synced branch), #127 (explicit repo lists and exclusions) and #128 (config from file).

This code was never published to nuget.org. It remains readable here for reference.

GitHub branch status

LicenseGitHub commit activityGitHub contributorsGitHub Actions Workflow Status

SyncFileContents is a .NET 9 console application that scans a directory for files with a specified name, compares their contents using SHA256 hashes, and allows the user to synchronize these files across the directory. It also provides Git integration for committing and pushing changes.

Features

  • Recursively scan a specified directory for files with a given name
  • Support for multiple filenames (comma-separated) and wildcard patterns
  • Compare file contents using SHA256 hashes
  • Display file paths grouped by hash with the oldest modification time for each hash group
  • Sort hash groups by modification time (most recent first)
  • Synchronize file contents across different directories within the scanned path
  • Automatically skip files in nested Git repositories (submodules)
  • Commit changes to Git repositories with automatic staging
  • Fetch, merge, and push changes to remote repositories
  • Interactive prompts with persistent history for paths and filenames
  • Persistent Git credentials storage

Table of Contents

Installation

To use SyncFileContents, you need to have .NET 9 SDK installed on your machine.

Clone the repository:

git clone https://github.com/ktsu-dev/SyncFileContents.git

Navigate to the project directory:

cd SyncFileContents

Build the project:

dotnet build

Usage

Run the application with optional command-line arguments:

dotnet run -- [path] [filename]

Command-Line Arguments

  • path: The path to recursively scan in. If not provided, you will be prompted to enter it interactively.
  • filename: The filename to scan for. If not provided, you will be prompted to enter it interactively. Supports wildcards and comma-separated values.

Example Usage

To scan the current directory for files named example.txt and synchronize their contents:

dotnet run -- . example.txt

To scan a specific directory for multiple config files:

dotnet run -- /path/to/projects "config.json,settings.json"

To run interactively without arguments:

dotnet run

Workflow

  1. Scan: The application recursively scans the specified directory for files matching the filename pattern
  2. Compare: Files are grouped by SHA256 hash to identify differing versions
  3. Display: Shows each unique hash with the oldest modification time for that hash group and associated file paths, sorted by modification time (most recent first)
  4. Select: If there are exactly two hash groups, the most recent is suggested first, then the older one if declined; otherwise, you enter the hash to use as the sync source
  5. Preview: A dry-run shows which files will be updated
  6. Sync: After confirmation, files are copied from the source to all destinations
  7. Commit: Outstanding changes in Git repositories can be committed
  8. Push: Repositories with only SyncFileContents commits can be automatically pushed

Git Credentials

On first run, you'll be prompted to enter your Git username and personal access token. These credentials are stored locally and used for push operations.

Development

Prerequisites

Building the Project

Clone the repository and navigate to the project directory:

git clone https://github.com/ktsu-dev/SyncFileContents.git
cd SyncFileContents

Build the project:

dotnet build

Running Tests

To run the tests, use the following command:

dotnet test

License

This project is licensed under the MIT License. See the LICENSE file for details.

About

A .NET console application that finds files sharing a given name across a directory tree, compares their contents by SHA256 hash, and synchronizes them to a single chosen version.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 20, 2026. It is now read-only.

Repository files navigation

SyncFileContents

Warning

This repository is archived and no longer maintained.

Its functionality has moved to ktsu-dev/KtsuTools as the ktsu sync command, which is a direct port with the same --path / --filename shape plus multi-filename support and --auto-push.

For the interactive, iterative-merge take on the same problem, see ktsu-dev/BlastMerge (published as ktsu.BlastMerge), which additionally supports directory exclusion and saved batch configurations.

The open feature requests were migrated to KtsuTools issues #125 (commit to a new branch), #126 (open a PR per synced branch), #127 (explicit repo lists and exclusions) and #128 (config from file).

This code was never published to nuget.org. It remains readable here for reference.

GitHub branch status

LicenseGitHub commit activityGitHub contributorsGitHub Actions Workflow Status

SyncFileContents is a .NET 9 console application that scans a directory for files with a specified name, compares their contents using SHA256 hashes, and allows the user to synchronize these files across the directory. It also provides Git integration for committing and pushing changes.

Features

  • Recursively scan a specified directory for files with a given name
  • Support for multiple filenames (comma-separated) and wildcard patterns
  • Compare file contents using SHA256 hashes
  • Display file paths grouped by hash with the oldest modification time for each hash group
  • Sort hash groups by modification time (most recent first)
  • Synchronize file contents across different directories within the scanned path
  • Automatically skip files in nested Git repositories (submodules)
  • Commit changes to Git repositories with automatic staging
  • Fetch, merge, and push changes to remote repositories
  • Interactive prompts with persistent history for paths and filenames
  • Persistent Git credentials storage

Table of Contents

Installation

To use SyncFileContents, you need to have .NET 9 SDK installed on your machine.

Clone the repository:

git clone https://github.com/ktsu-dev/SyncFileContents.git

Navigate to the project directory:

cd SyncFileContents

Build the project:

dotnet build

Usage

Run the application with optional command-line arguments:

dotnet run -- [path] [filename]

Command-Line Arguments

  • path: The path to recursively scan in. If not provided, you will be prompted to enter it interactively.
  • filename: The filename to scan for. If not provided, you will be prompted to enter it interactively. Supports wildcards and comma-separated values.

Example Usage

To scan the current directory for files named example.txt and synchronize their contents:

dotnet run -- . example.txt

To scan a specific directory for multiple config files:

dotnet run -- /path/to/projects "config.json,settings.json"

To run interactively without arguments:

dotnet run

Workflow

  1. Scan: The application recursively scans the specified directory for files matching the filename pattern
  2. Compare: Files are grouped by SHA256 hash to identify differing versions
  3. Display: Shows each unique hash with the oldest modification time for that hash group and associated file paths, sorted by modification time (most recent first)
  4. Select: If there are exactly two hash groups, the most recent is suggested first, then the older one if declined; otherwise, you enter the hash to use as the sync source
  5. Preview: A dry-run shows which files will be updated
  6. Sync: After confirmation, files are copied from the source to all destinations
  7. Commit: Outstanding changes in Git repositories can be committed
  8. Push: Repositories with only SyncFileContents commits can be automatically pushed

Git Credentials

On first run, you'll be prompted to enter your Git username and personal access token. These credentials are stored locally and used for push operations.

Development

Prerequisites

Building the Project

Clone the repository and navigate to the project directory:

git clone https://github.com/ktsu-dev/SyncFileContents.git
cd SyncFileContents

Build the project:

dotnet build

Running Tests

To run the tests, use the following command:

dotnet test

License

This project is licensed under the MIT License. See the LICENSE file for details.

About

A .NET console application that finds files sharing a given name across a directory tree, compares their contents by SHA256 hash, and synchronizes them to a single chosen version.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 20, 2026. It is now read-only.

Repository files navigation

SyncFileContents

Warning

This repository is archived and no longer maintained.

Its functionality has moved to ktsu-dev/KtsuTools as the ktsu sync command, which is a direct port with the same --path / --filename shape plus multi-filename support and --auto-push.

For the interactive, iterative-merge take on the same problem, see ktsu-dev/BlastMerge (published as ktsu.BlastMerge), which additionally supports directory exclusion and saved batch configurations.

The open feature requests were migrated to KtsuTools issues #125 (commit to a new branch), #126 (open a PR per synced branch), #127 (explicit repo lists and exclusions) and #128 (config from file).

This code was never published to nuget.org. It remains readable here for reference.

GitHub branch status

LicenseGitHub commit activityGitHub contributorsGitHub Actions Workflow Status

SyncFileContents is a .NET 9 console application that scans a directory for files with a specified name, compares their contents using SHA256 hashes, and allows the user to synchronize these files across the directory. It also provides Git integration for committing and pushing changes.

Features

  • Recursively scan a specified directory for files with a given name
  • Support for multiple filenames (comma-separated) and wildcard patterns
  • Compare file contents using SHA256 hashes
  • Display file paths grouped by hash with the oldest modification time for each hash group
  • Sort hash groups by modification time (most recent first)
  • Synchronize file contents across different directories within the scanned path
  • Automatically skip files in nested Git repositories (submodules)
  • Commit changes to Git repositories with automatic staging
  • Fetch, merge, and push changes to remote repositories
  • Interactive prompts with persistent history for paths and filenames
  • Persistent Git credentials storage

Table of Contents

Installation

To use SyncFileContents, you need to have .NET 9 SDK installed on your machine.

Clone the repository:

git clone https://github.com/ktsu-dev/SyncFileContents.git

Navigate to the project directory:

cd SyncFileContents

Build the project:

dotnet build

Usage

Run the application with optional command-line arguments:

dotnet run -- [path] [filename]

Command-Line Arguments

  • path: The path to recursively scan in. If not provided, you will be prompted to enter it interactively.
  • filename: The filename to scan for. If not provided, you will be prompted to enter it interactively. Supports wildcards and comma-separated values.

Example Usage

To scan the current directory for files named example.txt and synchronize their contents:

dotnet run -- . example.txt

To scan a specific directory for multiple config files:

dotnet run -- /path/to/projects "config.json,settings.json"

To run interactively without arguments:

dotnet run

Workflow

  1. Scan: The application recursively scans the specified directory for files matching the filename pattern
  2. Compare: Files are grouped by SHA256 hash to identify differing versions
  3. Display: Shows each unique hash with the oldest modification time for that hash group and associated file paths, sorted by modification time (most recent first)
  4. Select: If there are exactly two hash groups, the most recent is suggested first, then the older one if declined; otherwise, you enter the hash to use as the sync source
  5. Preview: A dry-run shows which files will be updated
  6. Sync: After confirmation, files are copied from the source to all destinations
  7. Commit: Outstanding changes in Git repositories can be committed
  8. Push: Repositories with only SyncFileContents commits can be automatically pushed

Git Credentials

On first run, you'll be prompted to enter your Git username and personal access token. These credentials are stored locally and used for push operations.

Development

Prerequisites

Building the Project

Clone the repository and navigate to the project directory:

git clone https://github.com/ktsu-dev/SyncFileContents.git
cd SyncFileContents

Build the project:

dotnet build

Running Tests

To run the tests, use the following command:

dotnet test

License

This project is licensed under the MIT License. See the LICENSE file for details.

About

A .NET console application that finds files sharing a given name across a directory tree, compares their contents by SHA256 hash, and synchronizes them to a single chosen version.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Aug 20, 2026. It is now read-only.

Repository files navigation

SyncFileContents

Warning

This repository is archived and no longer maintained.

Its functionality has moved to ktsu-dev/KtsuTools as the ktsu sync command, which is a direct port with the same --path / --filename shape plus multi-filename support and --auto-push.

For the interactive, iterative-merge take on the same problem, see ktsu-dev/BlastMerge (published as ktsu.BlastMerge), which additionally supports directory exclusion and saved batch configurations.

The open feature requests were migrated to KtsuTools issues #125 (commit to a new branch), #126 (open a PR per synced branch), #127 (explicit repo lists and exclusions) and #128 (config from file).

This code was never published to nuget.org. It remains readable here for reference.

GitHub branch status

LicenseGitHub commit activityGitHub contributorsGitHub Actions Workflow Status

SyncFileContents is a .NET 9 console application that scans a directory for files with a specified name, compares their contents using SHA256 hashes, and allows the user to synchronize these files across the directory. It also provides Git integration for committing and pushing changes.

Features

  • Recursively scan a specified directory for files with a given name
  • Support for multiple filenames (comma-separated) and wildcard patterns
  • Compare file contents using SHA256 hashes
  • Display file paths grouped by hash with the oldest modification time for each hash group
  • Sort hash groups by modification time (most recent first)
  • Synchronize file contents across different directories within the scanned path
  • Automatically skip files in nested Git repositories (submodules)
  • Commit changes to Git repositories with automatic staging
  • Fetch, merge, and push changes to remote repositories
  • Interactive prompts with persistent history for paths and filenames
  • Persistent Git credentials storage

Table of Contents

Installation

To use SyncFileContents, you need to have .NET 9 SDK installed on your machine.

Clone the repository:

git clone https://github.com/ktsu-dev/SyncFileContents.git

Navigate to the project directory:

cd SyncFileContents

Build the project:

dotnet build

Usage

Run the application with optional command-line arguments:

dotnet run -- [path] [filename]

Command-Line Arguments

  • path: The path to recursively scan in. If not provided, you will be prompted to enter it interactively.
  • filename: The filename to scan for. If not provided, you will be prompted to enter it interactively. Supports wildcards and comma-separated values.

Example Usage

To scan the current directory for files named example.txt and synchronize their contents:

dotnet run -- . example.txt

To scan a specific directory for multiple config files:

dotnet run -- /path/to/projects "config.json,settings.json"

To run interactively without arguments:

dotnet run

Workflow

  1. Scan: The application recursively scans the specified directory for files matching the filename pattern
  2. Compare: Files are grouped by SHA256 hash to identify differing versions
  3. Display: Shows each unique hash with the oldest modification time for that hash group and associated file paths, sorted by modification time (most recent first)
  4. Select: If there are exactly two hash groups, the most recent is suggested first, then the older one if declined; otherwise, you enter the hash to use as the sync source
  5. Preview: A dry-run shows which files will be updated
  6. Sync: After confirmation, files are copied from the source to all destinations
  7. Commit: Outstanding changes in Git repositories can be committed
  8. Push: Repositories with only SyncFileContents commits can be automatically pushed

Git Credentials

On first run, you'll be prompted to enter your Git username and personal access token. These credentials are stored locally and used for push operations.

Development

Prerequisites

Building the Project

Clone the repository and navigate to the project directory:

git clone https://github.com/ktsu-dev/SyncFileContents.git
cd SyncFileContents

Build the project:

dotnet build

Running Tests

To run the tests, use the following command:

dotnet test

License

This project is licensed under the MIT License. See the LICENSE file for details.

About

A .NET console application that finds files sharing a given name across a directory tree, compares their contents by SHA256 hash, and synchronizes them to a single chosen version.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 20, 2026. It is now read-only.

Repository files navigation

SyncFileContents

Warning

This repository is archived and no longer maintained.

Its functionality has moved to ktsu-dev/KtsuTools as the ktsu sync command, which is a direct port with the same --path / --filename shape plus multi-filename support and --auto-push.

For the interactive, iterative-merge take on the same problem, see ktsu-dev/BlastMerge (published as ktsu.BlastMerge), which additionally supports directory exclusion and saved batch configurations.

The open feature requests were migrated to KtsuTools issues #125 (commit to a new branch), #126 (open a PR per synced branch), #127 (explicit repo lists and exclusions) and #128 (config from file).

This code was never published to nuget.org. It remains readable here for reference.

GitHub branch status

LicenseGitHub commit activityGitHub contributorsGitHub Actions Workflow Status

SyncFileContents is a .NET 9 console application that scans a directory for files with a specified name, compares their contents using SHA256 hashes, and allows the user to synchronize these files across the directory. It also provides Git integration for committing and pushing changes.

Features

  • Recursively scan a specified directory for files with a given name
  • Support for multiple filenames (comma-separated) and wildcard patterns
  • Compare file contents using SHA256 hashes
  • Display file paths grouped by hash with the oldest modification time for each hash group
  • Sort hash groups by modification time (most recent first)
  • Synchronize file contents across different directories within the scanned path
  • Automatically skip files in nested Git repositories (submodules)
  • Commit changes to Git repositories with automatic staging
  • Fetch, merge, and push changes to remote repositories
  • Interactive prompts with persistent history for paths and filenames
  • Persistent Git credentials storage

Table of Contents

Installation

To use SyncFileContents, you need to have .NET 9 SDK installed on your machine.

Clone the repository:

git clone https://github.com/ktsu-dev/SyncFileContents.git

Navigate to the project directory:

cd SyncFileContents

Build the project:

dotnet build

Usage

Run the application with optional command-line arguments:

dotnet run -- [path] [filename]

Command-Line Arguments

  • path: The path to recursively scan in. If not provided, you will be prompted to enter it interactively.
  • filename: The filename to scan for. If not provided, you will be prompted to enter it interactively. Supports wildcards and comma-separated values.

Example Usage

To scan the current directory for files named example.txt and synchronize their contents:

dotnet run -- . example.txt

To scan a specific directory for multiple config files:

dotnet run -- /path/to/projects "config.json,settings.json"

To run interactively without arguments:

dotnet run

Workflow

  1. Scan: The application recursively scans the specified directory for files matching the filename pattern
  2. Compare: Files are grouped by SHA256 hash to identify differing versions
  3. Display: Shows each unique hash with the oldest modification time for that hash group and associated file paths, sorted by modification time (most recent first)
  4. Select: If there are exactly two hash groups, the most recent is suggested first, then the older one if declined; otherwise, you enter the hash to use as the sync source
  5. Preview: A dry-run shows which files will be updated
  6. Sync: After confirmation, files are copied from the source to all destinations
  7. Commit: Outstanding changes in Git repositories can be committed
  8. Push: Repositories with only SyncFileContents commits can be automatically pushed

Git Credentials

On first run, you'll be prompted to enter your Git username and personal access token. These credentials are stored locally and used for push operations.

Development

Prerequisites

Building the Project

Clone the repository and navigate to the project directory:

git clone https://github.com/ktsu-dev/SyncFileContents.git
cd SyncFileContents

Build the project:

dotnet build

Running Tests

To run the tests, use the following command:

dotnet test

License

This project is licensed under the MIT License. See the LICENSE file for details.

About

A .NET console application that finds files sharing a given name across a directory tree, compares their contents by SHA256 hash, and synchronizes them to a single chosen version.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Aug 20, 2026. It is now read-only.

Repository files navigation

SyncFileContents

Warning

This repository is archived and no longer maintained.

Its functionality has moved to ktsu-dev/KtsuTools as the ktsu sync command, which is a direct port with the same --path / --filename shape plus multi-filename support and --auto-push.

For the interactive, iterative-merge take on the same problem, see ktsu-dev/BlastMerge (published as ktsu.BlastMerge), which additionally supports directory exclusion and saved batch configurations.

The open feature requests were migrated to KtsuTools issues #125 (commit to a new branch), #126 (open a PR per synced branch), #127 (explicit repo lists and exclusions) and #128 (config from file).

This code was never published to nuget.org. It remains readable here for reference.

GitHub branch status

LicenseGitHub commit activityGitHub contributorsGitHub Actions Workflow Status

SyncFileContents is a .NET 9 console application that scans a directory for files with a specified name, compares their contents using SHA256 hashes, and allows the user to synchronize these files across the directory. It also provides Git integration for committing and pushing changes.

Features

  • Recursively scan a specified directory for files with a given name
  • Support for multiple filenames (comma-separated) and wildcard patterns
  • Compare file contents using SHA256 hashes
  • Display file paths grouped by hash with the oldest modification time for each hash group
  • Sort hash groups by modification time (most recent first)
  • Synchronize file contents across different directories within the scanned path
  • Automatically skip files in nested Git repositories (submodules)
  • Commit changes to Git repositories with automatic staging
  • Fetch, merge, and push changes to remote repositories
  • Interactive prompts with persistent history for paths and filenames
  • Persistent Git credentials storage

Table of Contents

Installation

To use SyncFileContents, you need to have .NET 9 SDK installed on your machine.

Clone the repository:

git clone https://github.com/ktsu-dev/SyncFileContents.git

Navigate to the project directory:

cd SyncFileContents

Build the project:

dotnet build

Usage

Run the application with optional command-line arguments:

dotnet run -- [path] [filename]

Command-Line Arguments

  • path: The path to recursively scan in. If not provided, you will be prompted to enter it interactively.
  • filename: The filename to scan for. If not provided, you will be prompted to enter it interactively. Supports wildcards and comma-separated values.

Example Usage

To scan the current directory for files named example.txt and synchronize their contents:

dotnet run -- . example.txt

To scan a specific directory for multiple config files:

dotnet run -- /path/to/projects "config.json,settings.json"

To run interactively without arguments:

dotnet run

Workflow

  1. Scan: The application recursively scans the specified directory for files matching the filename pattern
  2. Compare: Files are grouped by SHA256 hash to identify differing versions
  3. Display: Shows each unique hash with the oldest modification time for that hash group and associated file paths, sorted by modification time (most recent first)
  4. Select: If there are exactly two hash groups, the most recent is suggested first, then the older one if declined; otherwise, you enter the hash to use as the sync source
  5. Preview: A dry-run shows which files will be updated
  6. Sync: After confirmation, files are copied from the source to all destinations
  7. Commit: Outstanding changes in Git repositories can be committed
  8. Push: Repositories with only SyncFileContents commits can be automatically pushed

Git Credentials

On first run, you'll be prompted to enter your Git username and personal access token. These credentials are stored locally and used for push operations.

Development

Prerequisites

Building the Project

Clone the repository and navigate to the project directory:

git clone https://github.com/ktsu-dev/SyncFileContents.git
cd SyncFileContents

Build the project:

dotnet build

Running Tests

To run the tests, use the following command:

dotnet test

License

This project is licensed under the MIT License. See the LICENSE file for details.

About

A .NET console application that finds files sharing a given name across a directory tree, compares their contents by SHA256 hash, and synchronizes them to a single chosen version.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Aug 20, 2026. It is now read-only.

Repository files navigation

SyncFileContents

Warning

This repository is archived and no longer maintained.

Its functionality has moved to ktsu-dev/KtsuTools as the ktsu sync command, which is a direct port with the same --path / --filename shape plus multi-filename support and --auto-push.

For the interactive, iterative-merge take on the same problem, see ktsu-dev/BlastMerge (published as ktsu.BlastMerge), which additionally supports directory exclusion and saved batch configurations.

The open feature requests were migrated to KtsuTools issues #125 (commit to a new branch), #126 (open a PR per synced branch), #127 (explicit repo lists and exclusions) and #128 (config from file).

This code was never published to nuget.org. It remains readable here for reference.

GitHub branch status

LicenseGitHub commit activityGitHub contributorsGitHub Actions Workflow Status

SyncFileContents is a .NET 9 console application that scans a directory for files with a specified name, compares their contents using SHA256 hashes, and allows the user to synchronize these files across the directory. It also provides Git integration for committing and pushing changes.

Features

  • Recursively scan a specified directory for files with a given name
  • Support for multiple filenames (comma-separated) and wildcard patterns
  • Compare file contents using SHA256 hashes
  • Display file paths grouped by hash with the oldest modification time for each hash group
  • Sort hash groups by modification time (most recent first)
  • Synchronize file contents across different directories within the scanned path
  • Automatically skip files in nested Git repositories (submodules)
  • Commit changes to Git repositories with automatic staging
  • Fetch, merge, and push changes to remote repositories
  • Interactive prompts with persistent history for paths and filenames
  • Persistent Git credentials storage

Table of Contents

Installation

To use SyncFileContents, you need to have .NET 9 SDK installed on your machine.

Clone the repository:

git clone https://github.com/ktsu-dev/SyncFileContents.git

Navigate to the project directory:

cd SyncFileContents

Build the project:

dotnet build

Usage

Run the application with optional command-line arguments:

dotnet run -- [path] [filename]

Command-Line Arguments

  • path: The path to recursively scan in. If not provided, you will be prompted to enter it interactively.
  • filename: The filename to scan for. If not provided, you will be prompted to enter it interactively. Supports wildcards and comma-separated values.

Example Usage

To scan the current directory for files named example.txt and synchronize their contents:

dotnet run -- . example.txt

To scan a specific directory for multiple config files:

dotnet run -- /path/to/projects "config.json,settings.json"

To run interactively without arguments:

dotnet run

Workflow

  1. Scan: The application recursively scans the specified directory for files matching the filename pattern
  2. Compare: Files are grouped by SHA256 hash to identify differing versions
  3. Display: Shows each unique hash with the oldest modification time for that hash group and associated file paths, sorted by modification time (most recent first)
  4. Select: If there are exactly two hash groups, the most recent is suggested first, then the older one if declined; otherwise, you enter the hash to use as the sync source
  5. Preview: A dry-run shows which files will be updated
  6. Sync: After confirmation, files are copied from the source to all destinations
  7. Commit: Outstanding changes in Git repositories can be committed
  8. Push: Repositories with only SyncFileContents commits can be automatically pushed

Git Credentials

On first run, you'll be prompted to enter your Git username and personal access token. These credentials are stored locally and used for push operations.

Development

Prerequisites

Building the Project

Clone the repository and navigate to the project directory:

git clone https://github.com/ktsu-dev/SyncFileContents.git
cd SyncFileContents

Build the project:

dotnet build

Running Tests

To run the tests, use the following command:

dotnet test

License

This project is licensed under the MIT License. See the LICENSE file for details.

About

A .NET console application that finds files sharing a given name across a directory tree, compares their contents by SHA256 hash, and synchronizes them to a single chosen version.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages