The most reliable way I know, that works on most Unix OS (and Cygwin as well) is:
# (cd /source/dir && tar cf - .) | (cd /destination/dir && tar xpf -)
if source and destination already exist.
# (cd /parent/of/source/dir && tar cf - dir/) | (cd /parent/of/destination/dir && tar xpf -)
if destination does not exist yet.