您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Changes the copy button at the top of a pull-request to copy a git command to pull to a pr branch
- // ==UserScript==
- // @name Github manual merge
- // @namespace https://github.com/lordwelch/
- // @version 2.4
- // @description Changes the copy button at the top of a pull-request to copy a git command to pull to a pr branch
- // @license MIT
- // @author lordwelch
- // @match https://github.com/*
- // @icon https://www.google.com/s2/favicons?sz=64&domain=github.com
- // @grant none
- // @run-at document-idle
- // ==/UserScript==
- (async function() {
- 'use strict';
- console.log("script started");
- var pushState = history.pushState;
- var replaceState = history.replaceState;
- history.pushState = function() {
- pushState.apply(history, arguments);
- window.dispatchEvent(new Event('pushstate'));
- window.dispatchEvent(new Event('locationchange'));
- };
- history.replaceState = function() {
- replaceState.apply(history, arguments);
- window.dispatchEvent(new Event('replacestate'));
- window.dispatchEvent(new Event('locationchange'));
- };
- window.addEventListener('popstate', function() {
- window.dispatchEvent(new Event('locationchange'));
- });
- window.addEventListener("load", function() {
- window.dispatchEvent(new Event('locationchange'));
- });
- function breakCheck() {
- if (document.getElementById('gh-manual-pull-fix') != null) {
- console.log("fix is already applied");
- return true;
- }
- if (document.getElementById('gh-manual-merge-fix') != null) {
- console.log("fix is already applied");
- return true;
- }
- var location = document.location.pathname.match(/\/([^/]+)\/([^/]+)\/pull\/(\d+)$/);
- if (location == null) {
- console.log("incorrect page");
- return true;
- }
- return false;
- }
- function trimSuffix(str, suffix) {
- if (str.endsWith(suffix)) {
- return str.substr(0, str.length-suffix.length);
- }
- return str;
- }
- function trimPrefix(str, prefix) {
- if (str.startsWith(prefix)) {
- return str.substr(prefix.length-str.length);
- }
- return str;
- }
- function FixForkInstructions(argument) {
- if (breakCheck()) {
- return;
- }
- let location = document.location.pathname.match(/\/([^/]+)\/([^/]+)\/pull\/(\d+)$/);
- if (location == null) {
- return;
- }
- let upstreamPrNum = location[3];
- let headObj = document.querySelector('.commit-ref.head-ref');
- let [downstreamOwner, headRepoRef] = headObj.title.split('/');
- let [downstreamRepo, downStreamBranch] = headRepoRef.split(':');
- let baseObj = document.querySelector('.commit-ref.base-ref');
- let [upstreamOwner, baseRepoRef] = baseObj.title.split('/');
- let [upstreamRepo, upstreamBranch] = baseRepoRef.split(':');
- let downstreamUrl = `https://${document.location.host}/${downstreamOwner}/${downstreamRepo}`;
- let upstreamUrl = `https://${document.location.host}/${upstreamOwner}/${upstreamRepo}`;
- let localBranchName = `${downstreamOwner}/${downStreamBranch}-${upstreamPrNum}`
- let fetch = `git fetch --force ${downstreamUrl} +${downStreamBranch}:${localBranchName}`
- let pullInstructions = `git stash\ngit checkout ${upstreamBranch}\ngit fetch --force ${downstreamUrl} +${downStreamBranch}:${localBranchName}\ngit checkout ${localBranchName}`;
- let mergeInstructions = `git checkout ${upstreamBranch}\ngit merge ${localBranchName}`;
- let clipboardButtons = document.querySelectorAll("clipboard-copy.js-copy-branch");
- for (const cButton of clipboardButtons) {
- cButton.value = fetch;
- }
- if (breakCheck()) {
- return;
- }
- }
- function FixBranchInstructions(argument) {
- if (breakCheck()) {
- return;
- }
- let headObj = document.querySelector('.commit-ref.head-ref');
- let [downstreamOwner, headRepoRef] = headObj.title.split('/')
- let [downstreamRepo, downStreamBranch] = headRepoRef.split(':')
- let baseObj = document.querySelector('.commit-ref.base-ref');
- let [upstreamOwner, baseRepoRef] = baseObj.title.split('/')
- let [upstreamRepo, upstreamBranch] = baseRepoRef.split(':')
- let downstreamUrl = `https://${document.location.host}/${downstreamOwner}/${downstreamRepo}`;
- let upstreamUrl = `https://${document.location.host}/${upstreamOwner}/${upstreamRepo}`;
- var pullInstructions = `git stash\ngit checkout ${upstreamBranch}\ngit fetch --force ${downstreamUrl} +${downStreamBranch}:${downStreamBranch}\ngit checkout ${downStreamBranch}`;
- var mergeInstructions = `git checkout ${upstreamBranch}\ngit merge ${downStreamBranch}`;
- let clipboardButtons = document.querySelectorAll("clipboard-copy.js-copy-branch");
- for (const cButton of clipboardButtons) {
- cButton.value = fetch;
- }
- if (breakCheck()) {
- return;
- }
- }
- async function fixManualMergeInstructions() {
- console.log("script running");
- if (breakCheck()) {
- return;
- }
- var location = document.location.pathname.match(/\/([^/]+)\/([^/]+)\/pull\/(\d+)$/);
- if (location == null) {
- return;
- }
- var upstreamOwner = location[1];
- var upstreamRepo = location[2];
- var upstreamPrNum = location[3];
- var refObj = document.querySelector('.commit-ref.head-ref');
- while (refObj == null) {
- await new Promise(r => setTimeout(r, 300));
- console.log("Waiting for pr to load");
- if (breakCheck()) {
- return;
- }
- location = document.location.pathname.match(/\/([^/]+)\/([^/]+)\/pull\/(\d+)$/);
- if (location == null) {
- continue;
- }
- upstreamOwner = location[1];
- upstreamRepo = location[2];
- upstreamPrNum = location[3];
- }
- if (breakCheck()) {
- return;
- }
- let [downstreamOwner, repoRef] = refObj.title.split('/')
- let [downstreamRepo, downStreamBranch] = repoRef.split(':')
- if (downstreamRepo != upstreamRepo || downstreamOwner != upstreamOwner) {
- FixForkInstructions()
- } else {
- FixBranchInstructions()
- }
- }
- window.addEventListener('locationchange', fixManualMergeInstructions);
- fixManualMergeInstructions();
- })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址