create-gitee
Version:
快速初始化Git仓库并推送到Gitee的工具
300 lines (294 loc) • 11.8 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs = __importStar(require("fs"));
const readline = __importStar(require("readline"));
const child_process_1 = require("child_process");
// 创建命令行交互接口
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
// 问题询问函数
const askQuestion = (question, defaultValue) => {
const fullQuestion = defaultValue ? `${question} (默认: ${defaultValue}): ` : `${question}: `;
return new Promise((resolve) => {
rl.question(fullQuestion, (answer) => {
resolve(answer.trim() || defaultValue || '');
});
});
};
// 执行命令并处理错误
const executeCommand = (command, successMessage, errorMessage = '') => {
try {
(0, child_process_1.execSync)(command, { stdio: 'inherit' });
console.log(`\x1b[32m${successMessage}\x1b[0m`);
return true; // 返回 true 表示命令成功
}
catch (error) {
console.error(`\x1b[31m${errorMessage || `执行命令失败: ${command}`}\x1b[0m`);
console.error(error);
return false; // 返回 false 表示命令失败
}
};
// 创建.gitignore文件
const createGitignore = () => {
const defaultGitignore = `# 依赖
node_modules/
.pnp/
.pnp.js
# 测试
coverage/
# 生产环境
build/
dist/
# 环境变量
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
# 日志
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# 编辑器配置
.idea/
.vscode/
*.swp
*.swo
`;
try {
if (!fs.existsSync('.gitignore')) {
fs.writeFileSync('.gitignore', defaultGitignore, { encoding: 'utf-8' });
console.log('\x1b[32m已创建.gitignore文件\x1b[0m');
}
else {
console.log('\x1b[33m.gitignore文件已存在,跳过创建\x1b[0m');
}
}
catch (error) {
console.error('\x1b[31m创建.gitignore文件失败,请检查目录权限\x1b[0m');
console.error(error);
process.exit(1);
}
};
// 添加 Git 命令到 package.json
const addGitCommandToPackageJson = async (branch = 'main') => {
const packageJsonPath = './package.json'; // package.json 文件路径
try {
// 读取 package.json 文件内容
const packageJsonData = fs.readFileSync(packageJsonPath, { encoding: 'utf-8' });
const packageJson = JSON.parse(packageJsonData);
// 确保 scripts 字段存在
if (!packageJson.scripts) {
packageJson.scripts = {};
}
// 根据操作系统生成 Git 命令
const isWindows = process.platform === 'win32';
const gitCommand = isWindows
? 'powershell -Command "$msg = Read-Host \'Enter commit message\'; git add .; git commit -m \\\"$msg\\\"; git push"'
: `read -p \'Enter commit message: \' msg && git add . && git commit -m "$msg" && git push`;
// 更新 scripts 字段
packageJson.scripts['git'] = gitCommand;
// 写回 package.json 文件
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2), { encoding: 'utf-8' });
console.log(`\x1b[32m已成功添加 Git 命令: "git": "${gitCommand}"\x1b[0m`);
}
catch (error) {
console.error('\x1b[31m更新 package.json 失败\x1b[0m');
console.error(error);
}
};
// 检查并更新 package.json 中的 repository 字段
const checkAndUpdateRepository = async () => {
const packageJsonPath = './package.json';
let repoUrl = '';
try {
// 读取 package.json 文件内容
if (fs.existsSync(packageJsonPath)) {
const packageJsonData = fs.readFileSync(packageJsonPath, { encoding: 'utf-8' });
const packageJson = JSON.parse(packageJsonData);
// 检查是否存在 repository 字段
if (packageJson.repository) {
let existingRepoUrl = '';
if (typeof packageJson.repository === 'string') {
existingRepoUrl = packageJson.repository;
}
else if (packageJson.repository.url) {
existingRepoUrl = packageJson.repository.url;
}
if (existingRepoUrl) {
console.log(`\x1b[33m在 package.json 中检测到已设置的仓库地址: ${existingRepoUrl}\x1b[0m`);
const updateAnswer = await askQuestion('是否更新仓库地址?', 'n');
if (updateAnswer.toLowerCase() === 'y' || updateAnswer.toLowerCase() === 'yes') {
repoUrl = await askQuestion('请输入新的Git仓库地址');
}
else {
repoUrl = existingRepoUrl;
}
}
else {
repoUrl = await askQuestion('请输入Git仓库地址');
}
}
else {
repoUrl = await askQuestion('请输入Git仓库地址');
}
}
else {
repoUrl = await askQuestion('请输入Git仓库地址');
}
}
catch (error) {
console.error('\x1b[31m读取 package.json 失败\x1b[0m');
console.error(error);
repoUrl = await askQuestion('请输入Git仓库地址');
}
// 确保用户输入了仓库地址
while (!repoUrl) {
console.log('\x1b[31m未输入仓库地址,无法继续\x1b[0m');
repoUrl = await askQuestion('请重新输入Git仓库地址');
}
return repoUrl;
};
// 更新 package.json 中的 repository 字段
const updateRepositoryInPackageJson = async (repoUrl) => {
const packageJsonPath = './package.json';
try {
if (fs.existsSync(packageJsonPath)) {
const packageJsonData = fs.readFileSync(packageJsonPath, { encoding: 'utf-8' });
const packageJson = JSON.parse(packageJsonData);
// 设置 repository 字段
packageJson.repository = {
type: 'git',
url: repoUrl
};
// 写回 package.json 文件
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2), { encoding: 'utf-8' });
console.log(`\x1b[32m已成功设置 repository 字段为: ${repoUrl}\x1b[0m`);
}
else {
console.log('\x1b[33m未找到 package.json 文件,跳过设置 repository 字段\x1b[0m');
}
}
catch (error) {
console.error('\x1b[31m更新 package.json 中的 repository 字段失败\x1b[0m');
console.error(error);
}
};
// 设置或更新 Git remote origin
const setGitRemoteOrigin = (repoUrl) => {
try {
// 检查是否已经存在 origin
(0, child_process_1.execSync)('git remote get-url origin', { stdio: 'ignore' });
// 如果没有报错,说明 origin 存在,需要更新
executeCommand(`git remote set-url origin ${repoUrl}`, 'git remote origin 已更新', '更新 git remote origin 失败');
}
catch (error) {
// 如果报错,说明 origin 不存在,需要添加
executeCommand(`git remote add origin ${repoUrl}`, 'git remote 添加成功', 'git remote add 失败');
}
};
// 主函数
const main = async () => {
console.log('\x1b[34m欢迎使用create-gitee - 快速初始化Git仓库并推送到Gitee\x1b[0m\n');
// 1. 创建.gitignore文件
createGitignore();
// 2. 初始化 Git 仓库
const initAnswer = await askQuestion('是否执行git init?', 'y');
if (initAnswer.toLowerCase() === 'y' || initAnswer.toLowerCase() === 'yes') {
executeCommand('git init', 'git init 执行成功', 'git init 执行失败');
}
else {
console.log('跳过git init');
}
// 3. 添加文件到暂存区
const addAnswer = await askQuestion('是否执行git add .?', 'y');
if (addAnswer.toLowerCase() === 'y' || addAnswer.toLowerCase() === 'yes') {
executeCommand('git add .', 'git add . 执行成功', 'git add . 执行失败');
}
else {
console.log('跳过git add .');
}
// 4. 获取commit信息并执行commit
const commitMessage = await askQuestion('请输入commit备注信息', 'Initial commit');
if (commitMessage) {
const commitSuccess = executeCommand(`git commit -m "${commitMessage}"`, 'git commit 执行成功', 'git commit 执行失败');
if (!commitSuccess && /nothing to commit/.test((0, child_process_1.execSync)('git status').toString())) {
console.log('\x1b[33m没有需要提交的更改,跳过git commit\x1b[0m');
}
else if (!commitSuccess) {
console.log('\x1b[31mgit commit 失败,程序终止\x1b[0m');
process.exit(1);
}
}
else {
console.log('\x1b[31m未输入commit信息,跳过git commit\x1b[0m');
}
// 5. 获取仓库地址(已更新逻辑)
let repoUrl = await checkAndUpdateRepository();
// 6. 设置 repository 字段到 package.json
await updateRepositoryInPackageJson(repoUrl);
// 7. 获取分支名称
let branchName = await askQuestion('请输入分支名称', 'main');
let branch = branchName || 'main';
// 8. 设置或更新远程仓库 (修复了 remote origin already exists 的问题)
setGitRemoteOrigin(repoUrl);
// 9. 推送到远程仓库
let pushSuccess = false;
while (!pushSuccess) {
const pushAnswer = await askQuestion(`是否执行git push到${branch}分支?`, 'y');
if (pushAnswer.toLowerCase() === 'y' || pushAnswer.toLowerCase() === 'yes') {
pushSuccess = executeCommand(`git push -u origin ${branch}`, `git push 到${branch}分支成功`, `git push 到${branch}分支失败`);
if (!pushSuccess) {
console.log('\x1b[31mgit push 失败,请检查分支名称或网络连接\x1b[0m');
branch = await askQuestion('请重新输入分支名称', 'main');
}
}
else {
console.log('跳过git push');
break;
}
}
// 提示用户是否添加 Git 提交命令
const gitCommandAnswer = await askQuestion('是否在 package.json 中添加 Git 提交命令?', 'y');
if (gitCommandAnswer.toLowerCase() === 'y' || gitCommandAnswer.toLowerCase() === 'yes') {
await addGitCommandToPackageJson(branchName);
}
else {
console.log('跳过添加 Git 提交命令');
}
console.log('\n\x1b[32m操作完成!\x1b[0m');
rl.close();
};
// 启动程序
main().catch((error) => {
console.error('\x1b[31m程序出错\x1b[0m');
console.error(error);
rl.close();
process.exit(1);
});
;