OSC码云还是不错的,非常适合小公司或者个人组织,支持git和svn。但由于svn是在git基础上模拟出来的,因此git不支持提交空文件夹的特性也遗传到了svn上。
在OSC码云的网站上可以创建空文件夹,但是他会提示说“由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件”。
网上也搜了一下,也给一个解决方案吧,思路是:
1. 提供一个小程序,放在项目的根目录下(比如和README.md放一个目录下)。
2. 提交前,双击一下,程序会自动检查当前目录及其子目录,检测是否存在空目录。
3. 如果是空目录,则会自动添加一个.keep的空文本文件。
4. 程序不是空目录,则会检查是否只存在一个.keep文件,如果是,则不做任何处理;如果不是,则尝试删除.keep文件(不删除也没有关系,但对于我这种强迫症来说,很难受)。
5. 默认情况下,程序是走上面的逻辑。不过万一你想清空所有的.keep文件,加了个命令行参数,如果是"-clean .keep"就清空所有目录及子目录下名为.keep的文件。
以下是Java代码实现(也可以用bat, python, c/c++等)
import java.io.File;
import java.io.IOException;
public class gitsvn
{
public static final String GITSVN = ".keep";
private static void check(File path) throws Exception
{
File[] files = path.listFiles();
if(files.length == 0)
{
System.out.printf("+ %s/.keep\n", path.getAbsolutePath());
mark(path.getAbsolutePath());
}
else
{
if(files.length!=1 || !files[0].getName().equals(GITSVN))
{
for (int i=0; i<files.length; i++)
{
if(files[i].getName().equals(GITSVN))
{
System.out.printf("- %s\n", files[i].getAbsolutePath());
files[i].delete();
}
if (files[i].isDirectory())
{
try
{
check(files[i]);
}
catch (Exception e)
{
}
}
}
}
}
}
private static void clear(File path, String target) throws Exception
{
File[] files = path.listFiles();
for (int i=0; i<files.length; i++)
{
if(files[i].getName().equals(target))
{
System.out.printf("- %s\n", files[i].getName());
files[i].delete();
}
else if (files[i].isDirectory())
{
try
{
clear(files[i], target);
}
catch (Exception e)
{
}
}
}
}
public static void mark(String path)
{
File file = new File(path + "/" + GITSVN);
try
{
file.createNewFile();
}
catch (IOException e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
String home = System.getProperty("user.dir");
File file = new File(home);
try
{
if(args.length==2 && args[0].equals("-clean"))
{
clear(file, args[1]);
}
else
{
check(file);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
用法:
1. 命令行下:java -jar gitsvn.jar,或windows下直接双击。
2. 命令行下:java -jar gitsvn.jar -clean .keep,清空当前目录(及其子目录)下所有名为.keep的文件(.keep也可以换成其他的)。