NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name GitHub Full Clone Command
// @namespace http://tampermonkey.net/
// @version 2026-09-11
// @description Intercepts clipboard writes on GitHub to automatically prepend 'git clone ' to repository URLs.
// @author Bartek
// @license MIT
// @match https://github.com/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=github.com
// @grant none
// ==/UserScript==
(function() {
'use strict';
// Intercept the Clipboard API write function
if (navigator.clipboard && navigator.clipboard.writeText) {
const originalWriteText = navigator.clipboard.writeText;
navigator.clipboard.writeText = async function(text) {
if (text && (text.endsWith('.git') || (text.includes('github.com/') && !text.includes(' '))) && !text.startsWith('git clone ')) {
text = `git clone ${text}`;
console.log('[GitHub Clone Fixer] Prefixed clipboard text:', text);
}
return originalWriteText.call(navigator.clipboard, text);
};
}
// Also visually update input boxes for convenience
function patchInputs() {
document.querySelectorAll('input[type="text"], input[readonly]').forEach(input => {
const val = input.value;
if (val && (val.endsWith('.git') || val.includes('github.com/')) && !val.startsWith('git clone ')) {
input.value = `git clone ${val}`;
}
});
}
const observer = new MutationObserver(patchInputs);
observer.observe(document.body, { childList: true, subtree: true });
})();